[剑指 Offer 27]二叉树的镜像
迪丽瓦拉
2024-01-27 23:29:55
0

[剑指 Offer 27]二叉树的镜像

题目

  • 请完成一个函数,输入一个二叉树,该函数输出它的镜像。
  • 示例
输入:root = [4,2,7,1,3,6,9] 
输出:[4,7,2,9,6,3,1]输入图示:4/  \2   7/ \  / \1   3 6  9镜像输出:4/ \7   2/ \ / \9  6 3  1

题解

方法一:递归遍历二叉树交换每个结点的左右结点

  • 1.进入递归函数,将该结点的左右子结点交换
  • 2.将左右子结点作为根节点,进行下一次递归
  • 3.重复上述动作,root == null 时返回
class Solution {public TreeNode mirrorTree(TreeNode root) {traverse(root);return root;}void traverse(TreeNode root){if (root == null) return;//交换左右节点TreeNode tmp = root.left;root.left = root.right;root.right = tmp;traverse(root.left);traverse(root.right);}
}

方法二:利用辅助栈遍历树的所有节点,并交换每个结点的左/右子节点。

  • 1.初始化栈时,将根节点加入栈中
  • 2.然后开始循环,循环条件为栈不为空
  • 3.先将栈顶元素弹出,并判断该元素有无子结点
  • 4.有子结点则加入栈中,并交换左右子结点
  • 5.无子结点时,无结点入栈,下边交换其实交换的是null和null
  • 6.栈空时结束,交换完成,返回根结点
class Solution {public TreeNode mirrorTree(TreeNode root) {if(root == null) return null;Stack stack = new Stack<>() {{ add(root); }};while(!stack.isEmpty()) {TreeNode node = stack.pop();if(node.left != null) stack.add(node.left);if(node.right != null) stack.add(node.right);TreeNode tmp = node.left;node.left = node.right;node.right = tmp;}return root;}
}

相关内容