格式:
题号 题名 简单思路 code
总结二叉树的遍历
递归解法
/** * Definition for a binary tree node. * type TreeNode struct { * Val int * Left *TreeNode * Right *TreeNode * } */ func preorderTraversal(root *TreeNode) []int {
ans:=[]int{
} if root==nil {
return ans } assist(root,&ans) return ans } func assist(root *TreeNode,list *[]int) {
if root==nil {
return } // 三种次历变化 *list=append(*list,root.Val) assist(root.Left,list) assist(root.Right,list) }
栈解法
- 前序遍历(切片实现栈)
/** * Definition for a binary tree node. * type TreeNode struct { * Val int * Left *TreeNode * Right *TreeNode * } */ func preorderTraversal(root *TreeNode) []int {
ans:=[]int{
} if root==nil {
return ans } tmp:=[]*TreeNode{
root
}
for
len
(tmp
)
>
0
{
node
:=tmp
[
len
(tmp
)
-
1
] ans
=
append
(ans
,node
.Val
) tmp
=tmp
[
:
len
(tmp
)
-
1
]
if node
.Right
!=
nil
{
tmp
=
append
(tmp
,node
.Right
)
}
if node
.Left
!=
nil
{
tmp
=
append
(tmp
,node
.Left
)
}
}
return ans
}
- 前序遍历(双链表实现栈)
/** * Definition for a binary tree node. * type TreeNode struct { * Val int * Left *TreeNode * Right *TreeNode * } */
import "container/list"
func preorderTraversal(root *TreeNode) []int {
ans:=[]int{
}
if root==nil {
return ans
}
tmp:=list.New()
tmp.PushBack(root)
for node:=tmp.Back();node!=nil;node=tmp.Back() {
value:=node.Value.(*TreeNode)
ans=append(ans,value.Val)
tmp.Remove(node)
if value.Right!=nil {
tmp.PushBack(value.Right)
}
if value.Left!=nil {
tmp.PushBack(value.Left)
}
}
return ans
}
- 中序遍历
/** * Definition for a binary tree node. * type TreeNode struct { * Val int * Left *TreeNode * Right *TreeNode * } */
func inorderTraversal(root *TreeNode) []int {
ans:=[]int{
}
stack:=[]*TreeNode{
}
curr:=root
for len(stack)>0 || curr!=nil {
for curr!=nil {
stack=append(stack,curr)
curr=curr.Left
}
if len(stack)>0 {
node:=stack[len(stack)-1]
stack=stack[:len(stack)-1]
ans=append(ans,node.Val)
curr=node.Right
}
}
return ans
}
- 后序遍历
- 根-右-左的逆序,类似前序遍历
/** * Definition for a binary tree node. * type TreeNode struct { * Val int * Left *TreeNode * Right *TreeNode * } */
func postorderTraversal(root *TreeNode) []int {
ans:=[]int{
}
if root==nil {
return ans
}
tmp:=[]*TreeNode{
root}
for len(tmp)>0 {
node:=tmp[len(tmp)-1]
tmp=tmp[:len(tmp)-1]
ans=append([]int{
node.Val},ans...)
if node.Left!=nil {
tmp=append(tmp,node.Left)
}
if node.Right!=nil {
tmp=append(tmp,node.Right)
}
}
return ans
}
颜色标记法
- 示前序遍历,三种遍历基本类似
/** * Definition for a binary tree node. * type TreeNode struct { * Val int * Left *TreeNode * Right *TreeNode * } */
type Color int
const (
WHITE Color=0
BLACK Color=1
)
func preorderTraversal(root *TreeNode) []int {
ans:=[]int{
}
if root == nil {
return ans
}
tmp:=[][2]interface{
}{
[2]interface{
}{
root,WHITE}}
for len(tmp)>0 {
node:=tmp[len(tmp)-1]
tmp=tmp[:len(tmp)-1]
t_node:=node[0].(*TreeNode)
if t_node==nil {
continue
}
if node[1].(Color)==WHITE {
// 三种遍历更改处
tmp=append(tmp,[2]interface{
}{
t_node.Right,WHITE})
tmp=append(tmp,[2]interface{
}{
t_node.Left,WHITE})
tmp=append(tmp,[2]interface{
}{
t_node,BLACK})
} else {
ans=append(ans,t_node.Val)
}
}
return ans
}
- 示后序遍历
type Color int
const (
WHITE Color=0
BLACK Color=1
)
func postorderTraversal(root *TreeNode) []int {
ans:=[]int{
}
if root == nil {
return ans
}
tmp:=[][2]interface{
}{
[2]interface{
}{
root,WHITE}}
for len(tmp)>0 {
node:=tmp[len(tmp)-1]
tmp=tmp[:len(tmp)-1]
t_node:=node[0].(*TreeNode)
if t_node==nil {
continue
}
if node[1].(Color)==WHITE {
tmp=append(tmp,[2]interface{
}{
t_node,BLACK})
tmp=append(tmp,[2]interface{
}{
t_node.Right,WHITE})
tmp=append(tmp,[2]interface{
}{
t_node.Left,WHITE})
} else {
ans=append(ans,t_node.Val)
}
}
return ans
}
Morris遍历
- 参考
- 前序遍历
/** * Definition for a binary tree node. * type TreeNode struct { * Val int * Left *TreeNode * Right *TreeNode * } */
func preorderTraversal(root *TreeNode) []int {
ans:=[]int{
}
if root==nil {
return ans
}
curr:=root
for curr!=nil {
if left:=curr.Left;left!=nil {
prev:=findPrev(curr)
if prev.Right==nil {
ans=append(ans,curr.Val)
prev.Right=curr
curr=left
} else {
curr=curr.Right
prev.Right=nil
}
} else {
ans=append(ans,curr.Val)
curr=curr.Right
}
}
return ans
}
func findPrev(curr *TreeNode) *TreeNode {
t_node:=curr.Left
for t_node.Right!=nil && t_node.Right!=curr {
t_node=t_node.Right
}
return t_node
}
- 中序遍历
/** * Definition for a binary tree node. * type TreeNode struct { * Val int * Left *TreeNode * Right *TreeNode * } */
func inorderTraversal(root *TreeNode) []int {
ans:=[]int{
}
if root==nil {
return ans
}
curr:=root
for curr!=nil {
if left:=curr.Left;left!=nil {
prev:=findPrev(curr)
if prev.Right==nil {
prev.Right=curr
curr=left
} else {
ans=append(ans,curr.Val)
curr=curr.Right
prev.Right=nil
}
} else {
ans=append(ans,curr.Val)
curr=curr.Right
}
}
return ans
}
func findPrev(curr *TreeNode) *TreeNode {
t_node:=curr.Left
for t_node.Right!=nil && t_node.Right!=curr {
t_node=t_node.Right
}
return t_node
}
- 后序遍历
/** * Definition for a binary tree node. * type TreeNode struct { * Val int * Left *TreeNode * Right *TreeNode * } */
func postorderTraversal(root *TreeNode) []int {
ans:=[]int{
}
if root==nil {
return ans
}
curr:=root
for curr!=nil {
if right:=curr.Right;right!=nil {
prev:=findPrev(curr)
if prev.Left==nil {
ans=append([]int{
curr.Val},ans...)
prev.Left=curr
curr=right
} else {
curr=curr.Left
prev.Left=nil
}
} else {
ans=append([]int{
curr.Val},ans...)
curr=curr.Left
}
}
return ans
}
func findPrev(curr *TreeNode) *TreeNode {
t_node:=curr.Right
for t_node.Left!=nil && t_node.Left!=curr {
t_node=t_node.Left
}
return t_node
}
层序遍历
/** * Definition for a binary tree node. * type TreeNode struct { * Val int * Left *TreeNode * Right *TreeNode * } */
func levelOrder(root *TreeNode) [][]int {
ans:=make([][]int,0)
if root==nil {
return ans
}
arr1:=[]*TreeNode{
root}
for len(arr1) > 0 {
tmp:=make([]int,len(arr1))
arr2:=[]*TreeNode{
}
for idx,node := range arr1 {
tmp[idx]=node.Val
if node.Left!=nil {
arr2=append(arr2,node.Left)
}
if node.Right!=nil {
arr2=append(arr2,node.Right)
}
}
ans=append(ans,tmp)
arr1=arr2
}
return ans
}
T96: 给出不同的二叉搜索树数目
- 利用了BST的性质;这里为了避免重复计算,只算半边
- 记忆化递归
- Catalan数
var memo map[int]int=map[int]int{
0:1,1:1}
func numTrees(n int) int {
if v,ok:=memo[n];ok {
return v
}
v:=0
if n%2==1 {
for i:=0;i<n/2;i++ {
v+=numTrees(i)*numTrees(n-1-i)
}
v*=2
v+=numTrees(n/2)*numTrees(n-1-n/2)
} else {
for i:=0;i<n/2;i++ {
v+=numTrees(i)*numTrees(n-1-i)
}
v*=2
}
memo[n]=v
return v
}
T95: 给出不同的二叉搜索树
- 与T96类似
/** * Definition for a binary tree node. * type TreeNode struct { * Val int * Left *TreeNode * Right *TreeNode * } */ func generateTrees(n int) []*TreeNode { if n==0 { return nil } data:=make([]int,n) for i:=1;i<=n;i++ { data[i-1]=i } return generateTreesAssist(data) } func generateTreesAssist(data []int) []*TreeNode { if len(data)==0 { return []*TreeNode{ nil} } ans:=[]*TreeNode{ } for i:=0;i<len(data);i++ { list1:=generateTreesAssist(data[:i]) list2:=generateTreesAssist(data[i+1:]) for ix1:=range list1 { for ix2:=range list2 { tmp:=&TreeNode{ data[i],nil,nil} tmp.Left