- 一、题目
- 二、题目分析
- 三、递归法
- 四、非递归法
- 五、层序遍历
- 六、总结
翻转一棵二叉树。
二、题目分析题目要求翻转二叉树,其实只需要把每一个节点左右孩子交换(孩子下面的节点是一起交换的)即可
题目使用前序遍历和后序遍历都可,但是中序遍历不可以,因为中序遍历会把某些节点的左右孩子翻转两次
当然选择层序遍历也是可以的
三、递归法(1)确定递归参数和返回值
参数就是需要传入节点,返回的也是节点
(2)确定递归终止条件
当前节点为空时,返回
(3)确定单层递归的逻辑
选用前序遍历方式,所以先交换左右子树,然后再递归交换左右子树
class Solution { public TreeNode invertTree(TreeNode root) { //节点为空时,返回 if (root == null) { return null; } //交换左右子树 TreeNode temp = root.left; root.left = root.right; root.right = temp; //递归交换左子树 invertTree(root.left); //递归交换右子树 invertTree(root.right); return root; } }四、非递归法
依然选择前序遍历,非递归,即迭代借助栈实现
class Solution { public TreeNode invertTree(TreeNode root) { //节点为空时,返回 if (root == null) { return null; } //非递归实现需要借助栈 Deque五、层序遍历deque = new linkedList<>(); TreeNode node; TreeNode temp; deque.push(root); while (!deque.isEmpty()) { node = deque.pop(); //前序遍历:先处理节点,再入栈左右子树 temp = node.left; node.left = node.right; node.right = temp; if (node.left != null) { deque.push(node.left); } if (node.right != null) { deque.push(node.right); } } return root; } }
层序遍历,同样可以实现翻转,遍历过程中交换左右子树的节点即可。
class Solution { public TreeNode invertTree(TreeNode root) { //节点为空时,返回 if (root == null) { return null; } //层序遍历借助队列实现 Deque六、总结deque = new linkedList<>(); TreeNode node; TreeNode temp; //记录每层有多少节点 int size; deque.add(root); while (!deque.isEmpty()) { size = deque.size(); while (size > 0) { node = deque.poll(); temp = node.left; node.left = node.right; node.right = temp; if (node.left != null) { deque.add(node.left); } if (node.right != null) { deque.add(node.right); } size--; } } return root; } }
二叉树的题目,首先选择采用什么遍历方式
前中后序遍历
非递归实现遍历
层序遍历
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)