翻转
翻转二叉树翻转等价二叉树上下翻转二叉树
翻转 翻转二叉树翻转二叉树(简单)
先序就是自上而下的翻转
后序就是自下而上的翻转
都可以,但是不能中序!
// 将整棵树的节点翻转 TreeNode invertTree(TreeNode root) { // base case if (root == null) { return null; } // root 节点需要交换它的左右子节点 TreeNode tmp = root.left; root.left = root.right; root.right = tmp; // 让左右子节点继续翻转它们的子节点 invertTree(root.left); invertTree(root.right); return root; }翻转等价二叉树
添加链接描述
class Solution { public boolean flipEquiv(TreeNode root1, TreeNode root2) { if(root1==null && root2==null){ return true; } if(root1==null || root2==null){ return false; } if(root1.val!=root2.val){ return false; } //不翻转 || 翻转 return (flipEquiv(root1.left,root2.left) && flipEquiv(root1.right,root2.right)) || (flipEquiv(root1.left,root2.right) && flipEquiv(root1.right,root2.left)); } }上下翻转二叉树
添加链接描述
思露:
首先确定:是从下往上翻转,只需考虑左子树,右子树只会有一个节点
然后:翻转之后返回新的根节点,父子树根节点是拼接在翻转之后的左子树的最右孩子节点下面的。
class Solution { public TreeNode upsideDownBinaryTree(TreeNode root) { if (root==null){ return null; } return reverseTree(root); } private TreeNode reverseTree(TreeNode root) { if (root.left==null){ return root; } TreeNode newRoot=reverseTree(root.left);//拿到翻转之后的左子树的根节点 TreeNode r=newRoot; while (r.right!=null){ //找到左子树的最右孩子节点 r=r.right; } r.left=root.right; r.right=root; root.left=null; root.right=null; return newRoot; } }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)