标签:node 结点 right cur 872 Morris 二叉树 null left
题目来源:872. 叶子相似的树 // 请考虑一棵二叉树上所有的叶子,这些叶子的值按从左到右的顺序排列形成一个 叶值序列 。 // 举个例子,如上图所示,给定一棵叶值序列为 (6, 7, 4, 9, 8) 的树。 // 如果有两棵二叉树的叶值序列是相同,那么我们就认为它们是 叶相似 的。 // 如果给定的两个根结点分别为 root1 和 root2 的树是叶相似的,则返回 true;否则返回 false 。 解析: 这题难度为简单,如果熟悉二叉树的遍历确实不难,使用dfs,深度递归遍历获取叶子结点数组,然后比较。 最近刚刚学习了二叉树遍历节省空间的一种算法,Morris算法 但是在解此题的时候遇到了点小困难,Morris算法是利用叶子结点右子树为空的特性,将它指向中序遍历后继结点。这样就不能用是否左右子树为空来判断叶子结点了。 再次查看Morris算法的原理,叶子结点右子树为空时指向其中序遍历后继结点,遍历时再次还原为空,那么可以利用这一点。 1. 右子树在还原时判断如果左子树也为空则证明其为叶子结点 2. 查看是否还有遗漏的叶子结点,如果叶子结点为中序遍历最后一个结点,那么它是没有中序遍历后继结点的。此时左右子树均为空。/** * Definition for a binary tree node. * function TreeNode(val, left, right) { * this.val = (val===undefined ? 0 : val) * this.left = (left===undefined ? null : left) * this.right = (right===undefined ? null : right) * } */ /** * @param {TreeNode} root1 * @param {TreeNode} root2 * @return {boolean} */ var leafSimilar = function(root1, root2) { let r1 = morris(root1); let r2 = morris(root2); return r1.join(',') === r2.join(',') }; const morris=(root)=>{ let cur = root; let res = []; while(cur){ if(cur.left === null){ if(cur.right === null){ res.push(cur.val); } cur = cur.right; }else{ let node = cur.left; while(node && node.right !== null && node.right !== cur){ node = node.right; } if(node.right === null){ node.right = cur; cur = cur.left; }else{ if(node.left === null)res.push(node.val); node.right = null; cur = cur.right; } } } return res; }
标签:node,结点,right,cur,872,Morris,二叉树,null,left 来源: https://blog.51cto.com/u_15201483/2776353
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。