《剑指offer》57~61

57.二叉树的下一个结点

题目描述:给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。

思路分析:
给定节点可分为以下三种情况:
1.该节点有右子树节点,则下一个节点为右子树的最左端节点,在右子树不断向左遍历即可找到。
2.该节点为父节点的左子节点,则下一个节点为父节点。
3.该节点为父节点的右子节点,则需向上遍历找到某节点n为其父节点m的左子节点,即回到第二种情况,中序遍历的下一个节点为父节点m。

/*function TreeLinkNode(x){
    this.val = x;
    this.left = null;
    this.right = null;
    this.next = null;
}*/
function GetNext(pNode)
{
    if (pNode === null) {return null;}
    if (pNode.right) {
        pNode = pNode.right;
        while (pNode.left) {
            pNode = pNode.left;
        }
        return pNode;
    }
    while (pNode.next) {
        if (pNode.next.left === pNode) {
            return pNode.next;
        }
        pNode = pNode.next;
    }
    return null;
}

58.对称的二叉树

题目描述:请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。

思路分析:类似镜像二叉树的那道题,采取递归的方式,不断比较左子树和右子树是否对称以及左子树的子树和右子树的子树是否对称。

/* function TreeNode(x) {
    this.val = x;
    this.left = null;
    this.right = null;
} */
function isSymmetrical(pRoot)
{
    if (pRoot === null) return true;
    return Symmetrical(pRoot.left, pRoot.right);
    
    function Symmetrical(left, right) {
        //若左右子树均为空,则对称
        if (left === null && right === null) {
            return true;
        }
        //若左右子树其中一个为空,一个不为空,则不对称(二者皆空已被上一步排除掉)
        if (left === null || right === null) {
            return false;
        }
        //若左右子树值相等,则对称
        //再递归左子树的左右子树和右子树的左右子树是否对称
        if (left.val === right.val) {
            return Symmetrical(left.left, right.right) &&
                Symmetrical(left.right, right.left);
        }
    }
}

59.按之字形顺序打印二叉树

题目描述:请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。

思路分析:本题和层序遍历二叉树类似,但是注意奇数行从左往右,偶数行从右往左。可以用一个奇数栈和一个偶数栈分别存储,但push的顺序不同,一个从右往左,一个从左往右。

/* function TreeNode(x) {
    this.val = x;
    this.left = null;
    this.right = null;
} */
function Print(pRoot)
{
    const stackOdd = [];
    const stackEven = [];
    const lists = [];
    if (pRoot === null) return lists;
    stackOdd.push(pRoot);
    let i = 1;
    while (stackOdd.length !== 0 || stackEven.length !== 0) {
        const list = [];
        //奇数层
        if (i % 2 === 1) {
            while (stackOdd.length !== 0) {
                let temp = stackOdd.pop();
                list.push(temp.val);
                if (temp.left) {
                    stackEven.push(temp.left);
                }
                if (temp.right) {
                    stackEven.push(temp.right);
                }
            }
        } else {
            //偶数层
            while (stackEven.length !== 0) {
                let temp = stackEven.pop();
                list.push(temp.val);
                if (temp.right) {
                    stackOdd.push(temp.right);
                }
                if (temp.left) {
                    stackOdd.push(temp.left);
                }
            }
        }
        i++;
        lists.push(list);
    }
    return lists;
}

60.把二叉树打印成多行

题目描述:从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。

思路分析:在层序遍历的基础上,设置两个变量nextLevel存储下一层要打印的节点数,toBePrinted存储本层待打印的节点。

/* function TreeNode(x) {
    this.val = x;
    this.left = null;
    this.right = null;
} */
function Print(pRoot)
{
    const queue = [];
    const res = [];
    if (pRoot === null) return res;
    let nextLevel = 0;
    let toBePrinted = 1;
    let list = [];
    queue.push(pRoot);
    while (queue.length) {
        let temp = queue.shift();
        list.push(temp.val);
        toBePrinted--;
        if (temp.left) {
            queue.push(temp.left);
            nextLevel++;
        }
        if (temp.right) {
            queue.push(temp.right);
            nextLevel++;
        }
        if (toBePrinted === 0) {
            res.push(list);
            list = [];
            toBePrinted = nextLevel;
            nextLevel = 0;
        }
    }
    return res;
}

61.序列化二叉树

题目描述:请实现两个函数,分别用来序列化和反序列化二叉树

二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#),以 ! 表示一个结点值的结束(value!)。

二叉树的反序列化是指:根据某种遍历顺序得到的序列化字符串结果str,重构二叉树。

例如,我们可以把一个只有根节点为1的二叉树序列化为"1,",然后通过自己的函数来解析回这个二叉树。

思路分析:采用先序遍历的方式。

const arr = [];
function Serialize(pRoot) {
  // write code here
  if (pRoot === null) {
    arr.push('a');
  } else {
    arr.push(pRoot.val);
    Serialize(pRoot.left);
    Serialize(pRoot.right);
  }
}
function Deserialize() {
  // write code here
  let node = null;
  if (arr.length < 1) {
    return null;
  }
  const number = arr.shift();
  if (typeof number === 'number') {
    node = new TreeNode(number);
    node.left = Deserialize();
    node.right = Deserialize();
  }
  return node;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,254评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,875评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,682评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,896评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,015评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,152评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,208评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,962评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,388评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,700评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,867评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,551评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,186评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,901评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,142评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,689评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,757评论 2 351

推荐阅读更多精彩内容