LeetCode刷题笔记11
部分二叉树问题汇总
144. 二叉树的前序遍历
题目描述
给你二叉树的根节点 root ,返回它节点值的 前序 遍历。
代码
递归方式
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def preorderTraversal(self, root):
"""
:type root: TreeNode
:rtype: List[int]
"""
if root==None:
return None
list_1=[root.val]
if root.left!=None:
list_1+=self.preorderTraversal(root.left)
if root.right!=None:
list_1+=self.preorderTraversal(root.right)
return list_1
非递归方式
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def preorderTraversal(self, root):
"""
:type root: TreeNode
:rtype: List[int]
"""
res = []
p = root
stack = []
while p or stack:
while p:
res.append(p.val)
stack.append(p)
p = p.left
p = stack.pop().right
return res
94. 二叉树的中序遍历
代码
递归方式
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def inorderTraversal(self, root):
"""
:type root: TreeNode
:rtype: List[int]
"""
if root==None:
return root
if root.left==None and root.right==None:
return [root.val]
res=[]
if root.left!=None:
res=res+self.inorderTraversal(root.left)
res.append(root.val)
if root.right!=None:
res=res+self.inorderTraversal(root.right)
return res
非递归方式
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def inorderTraversal(self, root):
"""
:type root: TreeNode
:rtype: List[int]
"""
if root==None:
return root
if root.left==None and root.right==None:
return [root.val]
res = []
stack = []
p = root
while p or stack:
while p:
stack.append(p)
p = p.left
p = stack.pop()
res.append(p.val)
p = p.right
return res
145. 二叉树的后序遍历
代码
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def postorderTraversal(self, root):
"""
:type root: TreeNode
:rtype: List[int]
"""
if root==None:
return None
list_1=[]
if root.left!=None:
list_1+=self.postorderTraversal(root.left)
if root.right!= None:
list_1+=self.postorderTraversal(root.right)
list_1.append(root.val)
return list_1
102. 二叉树的层序遍历
题目描述
给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。
代码
class Solution(object):
def levelOrder(self, root):
"""
:type root: TreeNode
:rtype: List[List[int]]
"""
if not root:
return []
#q=[root]
if root==None:
return [[]]
q=[root]
res=[[root.val]]
while(len(q)):
tmp_q=[]
tmp_res=[]
for node in q:
if node.left!=None:
tmp_q.append(node.left)
tmp_res.append(node.left.val)
if node.right!=None:
tmp_q.append(node.right)
tmp_res.append(node.right.val)
q=tmp_q
if len(tmp_res)>0:
res.append(tmp_res)
return res
226. 翻转二叉树
题目描述
翻转一棵二叉树。
思路:递归
代码
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def invertTree(self, root):
"""
:type root: TreeNode
:rtype: TreeNode
"""
if root==None:
return root
tmp=self.invertTree(root.left)
root.left=self.invertTree(root.right)
root.right=tmp
return root
951. 翻转等价二叉树
题目描述
我们可以为二叉树 T 定义一个翻转操作,如下所示:选择任意节点,然后交换它的左子树和右子树。
只要经过一定次数的翻转操作后,能使 X 等于 Y,我们就称二叉树 X 翻转等价于二叉树 Y。
编写一个判断两个二叉树是否是翻转等价的函数。这些树由根节点 root1 和 root2 给出。
思路:
层序遍历,如果root1.leftroot2.left and root1.rightroot2.right,直接接入下一层。如果 root1.leftroot2.right and root1.rightroot2.left,将左右交换然后进入下一层
代码
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution(object):
def flipEquiv(self, root1, root2):
"""
:type root1: TreeNode
:type root2: TreeNode
:rtype: bool
"""
if root1==None and root2==None:
return True
if root1==None or root2==None:
return False
if root1.val!=root2.val:
return False
tmp_1=[root1]
tmp_2=[root2]
while(tmp_1 and tmp_2):
p1=tmp_1.pop()
p2=tmp_2.pop()
l1=-1
l2=-1
r1=-1
r2=-1
if (p1==None or p2==None): continue
if p1.left!=None:
l1=p1.left.val
if p1.right!=None:
r1=p1.right.val
if p2.left!=None:
l2=p2.left.val
if p2.right!=None:
r2=p2.right.val
if l1==l2 and r1==r2:
tmp_1.append(p1.left)
tmp_1.append(p1.right)
tmp_2.append(p2.left)
tmp_2.append(p2.right)
elif l1==r2 and r1==l2:
tmp_1.append(p1.left)
tmp_1.append(p1.right)
tmp_2.append(p2.right)
tmp_2.append(p2.left)
else:
return False
return True
101. 对称二叉树
题目描述
给定一个二叉树,检查它是否是镜像对称的。
思路:递归
代码
python
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution(object):
def isSymmetric(self, root):
"""
:type root: TreeNode
:rtype: bool
"""
if root==None:
return True
if root.left==None and root.right==None:
return True
def helper(left,right):
if left==None and right==None:
return True
if left==None or right==None:
return False
if left.val!=right.val:
return False
return helper(left.left,right.right) and helper(left.right,right.left)
return helper(root.left,root.right)
c++
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
bool helper(TreeNode* left,TreeNode* right){
if (left==NULL && right==NULL) return true;
if (left==NULL || right==NULL) return false;
if (left->val!=right->val) return false;
return helper(left->left,right->right) && helper(left->right,right->left);
}
bool isSymmetric(TreeNode* root) {
if (root==NULL) return true;
return helper(root->left,root->right);
}
};
java
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public boolean helper(TreeNode left,TreeNode right){
if (left==null && right==null) return true;
if (left==null || right==null) return false;
if (left.val!=right.val) return false;
return helper(left.left,right.right) && helper(left.right,right.left);
}
public boolean isSymmetric(TreeNode root) {
if (root==null) return true;
return helper(root.left,root.right);
}
}
非递归法
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution(object):
def isSymmetric(self, root):
"""
:type root: TreeNode
:rtype: bool
"""
if root==None:
return True
if root.left==None and root.right==None:
return True
if root.left==None or root.right==None:
return False
left=[root.left]
right=[root.right]
while(len(left) and len(right)):
l=left.pop(0)
r=right.pop(0)
if l.val!=r.val:
return False
if l.left and r.right:
left.append(l.left)
right.append(r.right)
elif l.left or r.right:
return False
if l.right and r.left:
left.append(l.right)
right.append(r.left)
elif l.right or r.left:
return False
if len(left)==0 and len(right)==0:
return True
else:
return False
669. 修剪二叉搜索树
题目描述
给你二叉搜索树的根节点 root ,同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树,使得所有节点的值在[low, high]中。修剪树不应该改变保留在树中的元素的相对结构(即,如果没有被移除,原有的父代子代关系都应当保留)。 可以证明,存在唯一的答案。
所以结果应当返回修剪好的二叉搜索树的新的根节点。注意,根节点可能会根据给定的边界发生改变。
思路:
根据二叉搜索树的性质,如果root.val不在范围内,根据小于low还是大于high来判断保留左子树还是右子树。然后递归
代码
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution(object):
def trimBST(self, root, low, high):
"""
:type root: TreeNode
:type low: int
:type high: int
:rtype: TreeNode
"""
if root==None:
return root
if root.left==None and root.right==None:
if root.val<=high and root.val>=low:
return root
else:
return None
if root.val<=high and root.val>=low:
root.left=self.trimBST(root.left,low,high)
root.right=self.trimBST(root.right,low,high)
elif root.val<low:
root=self.trimBST(root.right,low,high)
elif root.val>high:
root=self.trimBST(root.left,low,high)
return root