目录
树的遍历方式
树的常见遍历方法:
深度优先遍历
先往深走 ,遇道叶子节点再往回走。
说明:下面的前中后序指的是相对于中间节点的位置。
- 前序遍历:中左右
- 中序遍历:左中右
- 后序遍历:左右中
广度优先遍历
一层一层的去遍历,一层访问完再访问下一层。
使用中序后序恢复二叉树
- 中序:3 4 8 6 7 5 2 1 10 9 11 15 13 14 12
- 后序:8 7 6 5 4 3 2 10 15 14 13 12 11 9 1
图解
题目:从前序与中序遍历序列构造二叉树
题目链接:LeetCode-105. 从前序与中序遍历序列构造二叉树
思路:递归+“每个节点都可以是根节点”
Go代码
func buildTree(preorder []int, inorder []int) *TreeNode {
if len(preorder) == 0 {
return nil
}
root := &TreeNode{Val: preorder[0]}
i:=0
for ;i<len(inorder);i++ {
if inorder[i] == root.Val {
break
}
}
// 中序中:左中右,根节点左边都是left节点,右边都是right节点
// 前序中:中左右,根节点后left节点遍历完了之后紧跟着right节点,这里left节点、right个数可以从中序中获取
root.Left = buildTree(preorder[1:len(inorder[:i])+1], inorder[:i])
root.Right = buildTree(preorder[len(inorder[:i])+1:], inorder[i+1:])
return root
}
题目:从中序与后序遍历序列构造二叉树
题目链接:LeetCode-106. 从中序与后序遍历序列构造二叉树
Go代码
func buildTree(inorder []int, postorder []int) *TreeNode {
length := len(postorder)
if length == 0 {
return nil
}
root := &TreeNode{Val:postorder[length-1]}
i:=0
for ;i<len(inorder); i++ {
if inorder[i] == root.Val {
break
}
}
root.Left = buildTree(inorder[:i], postorder[:len(inorder[:i])])
root.Right = buildTree(inorder[i+1:], postorder[len(inorder[:i]):len(postorder)-1])
return root
}