###思路
首先题目的要求是原地
- 首先判断是否有root,如果没有则return空值
- 接下来将root.left二叉树复制给node,然后开始判断是否有if node,有的话继续判断该节点是否有右子节点while node.right:,如果有右子节点就继续判断node=node.right。
- 将根节点的右子节点复制到,刚刚搜索到的那个节点的右子节点node.right=root.right。
- 将整个根节点的左子节点覆盖根节点的右子节点root.right=root.left,并将根节点的左子节点重置为None
- 最后递归调用,参数为根节点的右子节点root.right,也就是现在root.right作为新的root根节点,之后的每次递归调用都更新根节点。
###具体代码以及注释如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| class Solution: def flatten(self, root: TreeNode) -> None: """ Do not return anything, modify root in-place instead. """ if not root: return self.flatten(root.left) self.flatten(root.right) if root.left and root.right: index = root.left while index.right: index=index.right index.right = root.right root.right=root.left root.left=None elif not root.right and root.left: root.right=root.left root.left=None
|
1.前序遍历
前序遍历执行的是中左右的遍历原则,即先遍历中间的根节点,然后左节点,最后右节点。这样获得的遍历顺序为:1245367
1 2 3 4 5 6 7 8 9
| def preorderTraversal(root): tree = [] def helper(node): if not node: return tree.append(node.val) helper(node.left) helper(node.right) helper(root) return tree
|
2.中序遍历
1 2 3 4 5 6 7 8 9
| def innerorderTraversal(root): tree = [] def helper(node): if not node: return helper(node.left) tree.append(node.val) helper(node.right) helper(root) return tree
|
3.后序遍历
后序遍历执行的是左右中的遍历原则,即先遍历中间的左节点,然后右节点,最后中节点。
1 2 3 4 5 6 7 8 9
| def postorderTraversal(root): tree = [] def helper(node): if not node: return helper(node.left) helper(node.right) tree.append(node.val) helper(root) return tree
|
4.总结规律
基于以上代码可见,二叉树的遍历基本的代码框架如下:
1 2 3 4 5 6 7 8
| def Traversal(root): tree = [] def helper(node): helper(root) return tree
|
1