[94. 二叉树的中序遍历](https://leetcode.cn/problems/binary-tree-inorder-traversal/description/?envType=problem-list-v2&envId=tree)
```python=
class TreeNode:
def __init__(self,val):
self.val = val
self.left = None
self.right = None
def build_tree(values):
root = TreeNode(values[0])
queue = [root]
i = 1
while i < len(values):
node = queue.pop(0)
if i < len(values) and values[i] != None:
node.left = TreeNode(values[i])
queue.append(node.left)
i += 1
if i < len(values) and values[i] != None:
node.right = TreeNode(values[i])
queue.append(node.right)
i += 1
return root
root = [1,"null",2,3]
for i in range(len(root)):
if root[i] == "null":
root[i] = None
rot = build_tree(root)
def mid(root):
if root == None:
return []
return mid(root.left) + [root.val] + mid(root.right)
print(mid(rot))
```
[144. 二叉树的前序遍历](https://leetcode.cn/problems/binary-tree-preorder-traversal/)
```python=
ro = [1,2,3,4,5,"null",8,"null","null",6,7,9]
for i in range(len(ro)):
if ro[i] == "null":
ro[i] = None
rot = buildtree(ro)
def forward(ro):
if ro == None:
return []
return [ro.val] + forward(ro.left) + forward(ro.right)
print(forward(rot))
```
[145. 二叉树的后序遍历](https://leetcode.cn/problems/binary-tree-postorder-traversal/)
```python=
ro = [1,2,3,4,5,"null",8,"null","null",6,7,9]
for i in range(len(ro)):
if ro[i] == "null":
ro[i] = None
rot = buildtree(ro)
def forward(ro):
if ro == None:
return []
return forward(ro.left) + forward(ro.right) + [ro.val]
print(forward(rot))
```
[100. 相同的树](https://leetcode.cn/problems/same-tree/description/?envType=problem-list-v2&envId=tree)
```python=
def istree(p,q):
if not p and not q:
return True
elif not p or not q:
return False
if p.val != q.val:
return False
return istree(p.left,q.left) and istree(p.right,q.right)
root1 = buildtree([1,2,3])
root2 = buildtree([1,2,3])
print(istree(root1,root2))
```
[101. 对称二叉树](https://leetcode.cn/problems/symmetric-tree/description/?envType=problem-list-v2&envId=tree)
```python=
def istree(p,q):
if not p and not q:
return True
elif not p or not q:
return False
if p.val != q.val:
return False
return istree(p.left,q.right) and istree(p.right,q.left)
root1 = buildtree([1,2,2,None,3,None,3])
print(istree(root1.left,root1.right))
```
[104. 二叉树的最大深度](https://leetcode.cn/problems/maximum-depth-of-binary-tree/description/?envType=problem-list-v2&envId=tree)
```python=
def dfs(node):
if node == None:
return 0
lh = dfs(node.left)
rh = dfs(node.right)
return 1 + max(lh,rh)
root = dfs([3,9,20,null,null,15,7]])
print(dfs(root))
```
[111. 二叉树的最小深度](https://leetcode.cn/problems/minimum-depth-of-binary-tree/description/)
```python=
def dfs(node):
if node == None:
return 0
if not node.left and not node.right:
return 1
if not node.left:
return dfs(node.right) + 1
if not node.right:
return dfs(node.left) + 1
return min(dfs(node.left),dfs(node.right)) + 1
root = buildtree([1,2,3,4,5])
print(dfs(root))
```
[102. 二叉树的层序遍历](https://leetcode.cn/problems/binary-tree-level-order-traversal/description/?envType=problem-list-v2&envId=tree)
```python=
def dfs(root):
if not root:return []
result = []
queue = [root]
while queue:
z = []
for i in range(len(queue)):
k = queue.pop(0)
z.append(k.val)
if k.left:
queue.append(k.left)
if k.right:
queue.append(k.right)
result.append(z)
return result
root = buildtree([3,9,20,None,None,15,7])
print(dfs(root))
```
[993. 二叉树的堂兄弟节点](https://leetcode.cn/problems/cousins-in-binary-tree/submissions/)
```python=
def dfs(root,x,y):
if not root:
return
death = 1
queue = [[root,None]]
h1,h2,p1,p2 = 0,0,0,0
while queue:
for i in range(len(queue)):
k,parent = queue.pop(0)
if k.val == x:
p1 = parent
h1 = death
if k.val == y:
p2 = parent
h2 = death
if k.left:
queue.append([k.left,k])
if k.right:
queue.append([k.right,k])
death += 1
return h1 == h2 and p1 != p2
root = buildtree([1,2,3,None,4,None,5])
x = 5;y = 4
print(dfs(root,x,y))
```
[112. 路径总和](https://leetcode.cn/problems/path-sum/description/?envType=problem-list-v2&envId=tree)
```python=
def dfs(root,su):
if root == None:
return False
queue = [[root,root.val]]
while queue:
node,k = queue.pop()
if node.left == None == node.right and k == su:
return True
if node.left:
queue.append([node.left,k + node.left.val])
if node.right:
queue.append([node.right,k + node.right.val])
return False
print(dfs(rot,t))
```
[226. 翻转二叉树](https://leetcode.cn/problems/invert-binary-tree/description/?envType=problem-list-v2&envId=tree)
```python=
def dfs(root):
if root == None:
return []
result = [root.val]
queue = [root]
while queue:
k = queue.pop(0)
if k.right != None:
queue.append(k.right)
result.append(k.right.val)
if k.left != None:
queue.append(k.left)
result.append(k.left.val)
return result
return dfs(root)
```
[257. 二叉树的所有路径](https://leetcode.cn/problems/binary-tree-paths/description/?envType=problem-list-v2&envId=tree)
```python=
result = []
def bfs(node,s):
if node == None:
return
s += str(node.val)
if node.left == node.right == None:
result.append(s)
else:
s += "->"
bfs(node.left,s)
bfs(node.right,s)
bfs(rot,"")
print(result)
```
[404. 左叶子之和](https://leetcode.cn/problems/sum-of-left-leaves/description/?envType=problem-list-v2&envId=tree)
```python=
def dfs(node):
if node is None:
return 0
if node.left and node.left.left is None and node.left.right is None:
return node.left.val + dfs(node.right)
return dfs(node.left) + dfs(node.right)
print(dfs(rot))
```
501. 二叉搜索树中的众数
```python=
class TreeNode:
def __init__(self, val):
self.val = val
self.left = None
self.right = None
def insert(node, val):
if node is None:
return TreeNode(val)
if val <= node.val:
node.left = insert(node.left, val)
elif val >= node.val:
node.right = insert(node.right, val)
return node
z = [1,None,2,2,3,None,3]
root = TreeNode(z[0])
for i in range(1, len(z)):
if z[i] != None:
insert(root, z[i])
def dfs(root):
if not root:
return []
result = {}
queue = [root]
while queue:
z = []
for i in range(len(queue)):
k = queue.pop(0)
if k.val not in result:
result[k.val] = 1
else:
result[k.val] += 1
if k.left:
queue.append(k.left)
if k.right:
queue.append(k.right)
return result
li = dfs(root)
c = [];c1 = [];l =[]
for i, j in li.items():
c.append(i)
c1.append(j)
ma = max(c1)
for i in range(len(c1)):
if c1[i] == ma:
l.append(c[i])
print(l)
```
[面试题 04.08. 首个共同祖先](https://leetcode.cn/problems/first-common-ancestor-lcci/description/?envType=problem-list-v2&envId=depth-first-search)
```python=
# 低效率版
result = []
def bfs(node,s,va):
if node == None:
return
s += str(node.val)
if node.val == va:
result.append(s)
return
else:
bfs(node.left,s,va)
bfs(node.right,s,va)
bfs(rot,"",p)
bfs(rot,"",q)
ma = 0
for i in range(len(result[0])):
if result[0][i] == result[1][i]:
ma = result[1][i]
else:
break
print(ma)
```
樹的直徑
```python=
n = int(input())
adj = [[] for i in range(n+1)]
bol = [True] + [False for i in range(n)]
for i in range(n-1):
a,b = map(int,input().split())
adj[a].append(b)
bol[b] = True
p = bol.index(False)
def dfs(s):
ans = 0
for i in adj[s]:
ans = max(ans,dfs(i)+1)
return ans
if len(adj[p]) == 1:
print(dfs(p))
else:
print(1 + dfs(adj[p][0]))
print(1 + dfs(adj[p][1]))
```