当前位置: 首页 > 科技观察

一篇讲解对称二叉树实现思路的文章_0

时间:2023-03-22 15:01:32 科技观察

在二叉树的镜像中,我们知道解决这个问题的方法是先序遍历,那么我们可以修改前序遍历算法。遍历父节点后,先遍历其右子节点。节点,然后遍历它的左子节点,我们称这种算法为:对称前序遍历。对于下图所示的两棵树,我们列出两次遍历的结果:树A:前序遍历:8,6,5,7,6,7,5对称前序遍历:8,6,5,7,6,7,5树B:前序遍历:8,6,5,7,9,7,5对称前序遍历:8,9,5,7,6,7,5经过比较,我们发现树A的两种遍历方法结果相同,则对称;B树的结果不一样,不是对称的。如果有一棵不完全二叉树,它的所有节点都相同,是对称的吗?针对这种情况,我们需要完成其默认的空节点。完成后的两次遍历结果为:前序遍历:7,7,7,null,null,7,null,null,7,7,null,null,null对称前序遍历:7,7,null,7,null,null,7,7,null,null,7,null,null对比两个结果,发现没有,那么就不是对称的了。实现代码有了思路之后,再来看代码实现,如下:从树的根节点开始,递归比较它的左子节点和右子节点。比较过程中:都到达叶子节点,说明这棵树的任一侧对称,都到达叶子节点,说明这棵树的不对称节点的值不同,这棵树是不对称的。导出函数SymmetricBinaryTree(node:BinaryTreeNode|null):boolean{returnisSymmetrical(node,node);}functionisSymmetrical(node:BinaryTreeNode|null|undefined,cloneNode:BinaryTreeNode|null|undefined):boolean{//到达叶子节点,两者都是nul表示同一个节点if(node==null&&cloneNode==空){返回真;}//任何一方都到达叶节点,即节点不同if(node==null||cloneNode==null){returnfalse;}//节点值不同if(node.key!=cloneNode.key){returnfalse;}//分别比较树的左右子节点return(isSymmetrical(node.left,cloneNode.right)&&isSymmetrical(node.right,cloneNode.left));}接下来我们以章节中列举的例子为例举个例子,带入上面的代码,验证是否可以判断正确,如下:consttree:BinaryTreeNode={key:8,left:{key:6,left:{key:5},right:{key:7}},右:{key:6,左:{key:7},右:{key:5}}};constisSymmetric=SymmetricBinaryTree(tree);console.log(tree,"是否为对称二叉树:",isSymmetric);示例代码本文使用的完整版代码请访问:SymmetricBinaryTreesymmetricBinaryTree-test.ts