学习资料源于大佬labuladong的公众号。
一、 二叉树的重要性
快速排序就是二叉树的前序遍历,归并排序就是二叉树的后序遍历
快速排序: 先构造分界点,然后去左右子数组构造分界点;
归并排序: 先对左右子数组排序,然后合并。
二、写递归算法的秘诀
递归算法的关键是要明确函数的 定义 是什么,利用这个定义推导最终的结果,绝不要试图跳入递归
树相关的算法,先搞清楚当前root节点该做什么,然后根据函数定义递归调用子节点,让子节点做相同的事情。
三、算法实践
226. 翻转二叉树(Easy)
思路:
只要把二叉树上的每一个节点的左右子节点进行交换,最后的结果就是完全翻转之后的二叉树。
Python
class Solution:
def invertTree(self, root: TreeNode) -> TreeNode:
if not root:
return root
l = self.invertTree(root.left)
r = self.invertTree(root.right)
root.left = r
root.right = l
return root
C++
class Solution {
public:
TreeNode* invertTree(TreeNode* root) {
if (root==NULL) return root;
TreeNode *l = invertTree(root->left);
TreeNode *r = invertTree(root->right);
root->left = r;
root->right = l;
return root;
}
};
114. 将二叉树展开为链表(Medium)
给定一个二叉树,原地将它展开为一个单链表。
flatten(root)函数的定义:把以root为根的二叉树拉平为一条链表。
步骤:
- 把root的左右子树拉平为链表;
- root.left赋为空;
- 左子树赋给root.left;
- 右子树接到左子树链表的最后(p.right)。
二叉树定义(曾经在面试中遇见过。。。)
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
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)
l = root.left
r = root.right
root.left = None
root.right = l
p = root
while p.right:
p = p.right
p.right = r
return
116. 填充二叉树节点的右侧指针(Medium)
需要连接不属于同一个父节点的节点(如上图5、6),所以需要一个辅助的函数,「将每一层二叉树节点连接起来」可以细化成「将每两个相邻节点都连接起来」。
定义:connectTwoNode()函数,把两个节点连接起来,需要连接的有两种情况
- 同一个父节点的左右子节点;
- 相邻父节点的子节点。
"""
# Definition for a Node.
class Node:
def __init__(self, val: int = 0, left: 'Node' = None, right: 'Node' = None, next: 'Node' = None):
self.val = val
self.left = left
self.right = right
self.next = next
"""
class Solution:
def connect(self, root: 'Node') -> 'Node':
if not root:
return root
self.connectTwoNode(root.left,root.right)
return root
def connectTwoNode(self,l,r):
if not l or not r:
return
l.next = r
self.connectTwoNode(l.left,l.right)
self.connectTwoNode(r.left,r.right)
self.connectTwoNode(l.right,r.left)
参考资料:
https://mp.weixin.qq.com/s/izZ5uiWzTagagJec6Y7RvQ