LeetCode 226 翻转二叉树
思路:遍历节点,交换左右孩子的顺序即可。前序遍历(中左右)、后序遍历(左右中)都可以,中序遍历这样写就行不通,会做多余的翻转操作。
遍历的写法:
1.确定参数和返回值 参数:根节点,返回值TreeNode。 这是题目规定好的,无需多言
2.终止条件 当前节点为空节点,返回
3.单层递归顺序。 前序,后序遍历都可。
迭代法的写法;
迭代法,主要是深度优先遍历和广度优先遍历的写法。
深度优先遍历(栈):
1.当前节点不为空,压入栈
2.当栈内不为空,获取栈顶元素,出栈。
并交换栈顶元素的左右孩子
3.做前序遍历。如果栈顶存在左孩子,压入栈。左孩子遍历完再遍历右孩子。
广度优先遍历(层序遍历,队列): 把每层的值进行交换
广度优先遍历和深度优先遍历的不同之处在于。
广度优先遍历,拿到每一层的所有元素,进行一个顺序交换。深度优先遍历,从一个节点一直走下去,再往回走。
//DFS递归 class Solution { /** * 前后序遍历都可以 * 中序不行,因为先左孩子交换孩子,再根交换孩子(做完后,右孩子已经变成了原来的左孩子),再右孩子交换孩子(此时其实是对原来的左孩子做交换) */ public TreeNode invertTree(TreeNode root) { if (root == null) { return null; } invertTree(root.left); invertTree(root.right); swapChildren(root); return root; } private void swapChildren(TreeNode root) { TreeNode tmp = root.left; root.left = root.right; root.right = tmp; } } //BFS class Solution { public TreeNode invertTree(TreeNode root) { if (root == null) {return null;} ArrayDeque<TreeNode> deque = new ArrayDeque<>(); deque.offer(root); while (!deque.isEmpty()) { int size = deque.size(); while (size-- > 0) { //区别于深度优先遍历,拿到当前层的所有元素。深度优先遍历是当前元素不为空,就一直走下去。 TreeNode node = deque.poll(); swap(node); if (node.left != null) {deque.offer(node.left);} if (node.right != null) {deque.offer(node.right);} } } return root; } public void swap(TreeNode root) { TreeNode temp = root.left; root.left = root.right; root.right = temp; } }
标签:deque,遍历,TreeNode,root,代码,随想录,right,Day18,left From: https://www.cnblogs.com/dwj-ngu/p/16864710.html