二叉树与递归

二叉树的递归遍历----以leetcode例题为例

树的递归遍历核心是:root节点做什么,孩子节点做相同的事情

一、入门简单

1、LeetCode94. 二叉树的中序遍历

左根右

 1 # Definition for a binary tree node.
 2 # class TreeNode:
 3 #     def __init__(self, val=0, left=None, right=None):
 4 #         self.val = val
 5 #         self.left = left
 6 #         self.right = right
 7 class Solution:
 8     def inorderTraversal(self, root: TreeNode) -> List[int]:
 9         ans=[]
10         def inorder(root):
11             if root==None:
12                 return
13             inorder(root.left)
14             ans.append(root.val)
15             inorder(root.right)
16         inorder(root)
17         return ans

二、中等难度

1、leetcode 226.翻转二叉树

 root节点:让左右节点翻转,孩子节点也翻转

 1 # Definition for a binary tree node.
 2 # class TreeNode:
 3 #     def __init__(self, val=0, left=None, right=None):
 4 #         self.val = val
 5 #         self.left = left
 6 #         self.right = right
 7 class Solution:
 8     def invertTree(self, root: TreeNode) -> TreeNode:
 9         if(root==None):
10             return None 
11         tmp=root.left
12         root.left=root.right
13         root.right=tmp
14         self.invertTree(root.left)
15         self.invertTree(root.right)
16 
17         return root

2、leetcode 654.最大二叉树

 

 root 找到最大值为root值,最大值左边建造左儿子们,最大值右边建造右儿子们

 1 # Definition for a binary tree node.
 2 # class TreeNode:
 3 #     def __init__(self, val=0, left=None, right=None):
 4 #         self.val = val
 5 #         self.left = left
 6 #         self.right = right
 7 class Solution:
 8     def constructMaximumBinaryTree(self, nums: List[int]) -> TreeNode:
 9         if len(nums)==0:
10             return None
11         large=-1
12         indx=-1
13         
14         for i in range(len(nums)):
15             if nums[i]>large:
16                 large=nums[i]
17                 indx=i
18         root = TreeNode(large)
19         root.left=self.constructMaximumBinaryTree(nums[:indx])
20         root.right=self.constructMaximumBinaryTree(nums[indx+1:])
21         return root

3、leetcode 116.填充每个节点的下一个右侧节点指针

 root这里做的事什么

 1 """
 2 # Definition for a Node.
 3 class Node:
 4     def __init__(self, val: int = 0, left: 'Node' = None, right: 'Node' = None, next: 'Node' = None):
 5         self.val = val
 6         self.left = left
 7         self.right = right
 8         self.next = next
 9 """
10 
11 class Solution:
12     def connect(self, root: 'Node') -> 'Node':
13         if(root==None):
14             return None
15         self.connectAdjacent(root.left, root.right)
16         return root
17 
18     def connectAdjacent(self, n1:'Node', n2:'Node')->'Node':
19         if n1==None or n2 ==None:
20             return 
21         n1.next=n2
22         self.connectAdjacent(n1.left, n1.right)
23         self.connectAdjacent(n1.right,n2.left)
24         self.connectAdjacent(n2.left,n2.right)

4、leetcode 114. 二叉树展开为链表

先序遍历,左子树的记录保存

 1 /**
 2  * Definition for a binary tree node.
 3  * struct TreeNode {
 4  *     int val;
 5  *     TreeNode *left;
 6  *     TreeNode *right;
 7  *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 8  *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 9  *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
10  * };
11  */
12 class Solution {
13 public:
14     void flatten(TreeNode* root) {
15        if(root==nullptr){
16            return;
17        }
18        flatten(root->left);
19        flatten(root->right);
20        TreeNode* left=root->left;
21        TreeNode* right=root->right;
22        root->left=nullptr;
23        root->right=left;
24 
25        TreeNode* p=root;
26        while(p->right!=nullptr){
27            p=p->right;
28        }
29        p->right=right;
30     }
31 };

5、105. 从前序与中序遍历序列构造二叉树

对于root,根据前序遍历找出root的值,找出root的值在中序遍历中的位置,分段左右子树

 1 # Definition for a binary tree node.
 2 # class TreeNode:
 3 #     def __init__(self, val=0, left=None, right=None):
 4 #         self.val = val
 5 #         self.left = left
 6 #         self.right = right
 7 class Solution:
 8     def buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode:
 9         return self.build(preorder, 0, len(preorder)-1, inorder, 0, len(inorder)-1)
10     def build(self, preorder, pStart, pEnd, inorder, iStart, iEnd):
11         if (pStart>pEnd):
12             return None
13         root=TreeNode(preorder[pStart])
14         indx=inorder.index(preorder[pStart])
15         leftsize=indx-iStart
16         root.left=self.build(preorder, pStart+1, pStart+leftsize, inorder, iStart, indx-1)
17         root.right=self.build(preorder, pStart+leftsize+1, pEnd, inorder, indx+1, iEnd)
18         return root

6、106. 从中序与后序遍历序列构造二叉树

 对于root,对比前面的前序和中序

 1 # Definition for a binary tree node.
 2 # class TreeNode:
 3 #     def __init__(self, val=0, left=None, right=None):
 4 #         self.val = val
 5 #         self.left = left
 6 #         self.right = right
 7 class Solution:
 8     def buildTree(self, inorder: List[int], postorder: List[int]) -> TreeNode:
 9         return self.build(inorder,0, len(inorder)-1, postorder,0, len(postorder)-1)
10     
11     def build(self, inorder, istart, iend, postorder, pstart, pend):
12         if istart>iend:
13             return None
14         root=TreeNode(postorder[pend])
15         indx=inorder.index(postorder[pend])
16         leftsize=indx-istart
17         root.left=self.build(inorder, istart,indx-1, postorder,pstart,pstart+leftsize-1)
18         root.right=self.build(inorder,indx+1, iend, postorder, pstart+leftsize, pend-1)
19         return root

7、652. 寻找重复的子树

 对于每个节点,找出完整形状,并保存起来

 1 # Definition for a binary tree node.
 2 # class TreeNode:
 3 #     def __init__(self, val=0, left=None, right=None):
 4 #         self.val = val
 5 #         self.left = left
 6 #         self.right = right
 7 class Solution:
 8     def findDuplicateSubtrees(self, root: TreeNode) -> List[TreeNode]:
 9         memo=collections.Counter()
10         res=[]
11         self.traverse(root, memo,res)
12         return res
13     
14     def traverse(self, root,memo,res):
15         if(root==None):
16             return '#'
17         left=self.traverse(root.left,memo,res)
18         right=self.traverse(root.right,memo,res)
19 
20         subTree=str(left)+','+str(right)+','+str(root.val)
21         memo[subTree]+=1
22         if memo[subTree]==2:
23             res.append(root)
24         return subTree
原文地址:https://www.cnblogs.com/z-712/p/14694156.html