力扣链接如下:
基础介绍:
-
二叉树前序遍历(Pre - order Traversal)
-
定义与遍历顺序:
- 前序遍历的顺序是 “根 - 左 - 右”。也就是说,先访问根节点,然后递归地遍历左子树,最后递归地遍历右子树。
- 例如,对于如下简单的二叉树:
-
1
/ \
2 3
/ \ / \
4 5 6 7
- 其前序遍历的顺序是:1、2、4、5、3、6、7。首先访问根节点 1,然后按照前序遍历的规则访问根节点 1 的左子树(2 是左子树的根节点,先访问 2,接着访问 2 的左子树 4,再访问 2 的右子树 5),最后访问根节点 1 的右子树(3 是右子树的根节点,先访问 3,接着访问 3 的左子树 6,再访问 3 的右子树 7)。
2. 二叉树后序遍历(Post - order Traversal)
-
定义与遍历顺序:
- 对于前面提到的相同二叉树:
- 后序遍历的顺序是 “左 - 右 - 根”。即先递归地遍历左子树,然后递归地遍历右子树,最后访问根节点。
1
/ \
2 3
/ \ / \
4 5 6 7
- 其后序遍历的顺序是:4、5、2、6、7、3、1。先访问根节点 1 的左子树(从最底层的左子树节点开始,4 是 2 的左子树节点,先访问 4,接着访问 2 的右子树 5,然后访问左子树的根节点 2),然后访问根节点 1 的右子树(从最底层开始,6 是 3 的左子树节点,先访问 6,接着访问 3 的右子树 7,然后访问右子树的根节点 3),最后访问根节点 1。
解题思路
1.前序遍历:
创造两个数组:
一个用于记录前序遍历的数组
另一个用于模仿栈
首先将root节点入栈
使用while循环实现迭代,判断的条件是栈不为空
用node实现更新,同时node正是中间节点。在实现node遍历中间节点的同时将node的值存入arr中
利用栈的先进后出的特性先存入右节点再存入左节点,在出栈的时候即能得到左节点在右节点的前面。
var preorderTraversal = function(root) {
let stack=[]
let arr=[]
stack.push(root)
while(stack.length){
let node=stack.pop()
if(node!=null){
arr.push(node.val)
}
else{
continue
}
stack.push(node.right)
stack.push(node.left)
}
return arr
};
2.后序遍历:
其实在解本题前需熟悉二叉树的前序遍历的迭代方式
因为前序遍历的方式是:中 左 右
而后序遍历的方式是: 左 右 中
首先将前序遍历顺序变成:中 右 左,得到整个数组后,使用双指针将整个数组翻转后得到遍历的顺序为:左 右 中
var postorderTraversal = function(root) {
let arr=[]
let stack=[]
stack.push(root)
while(stack.length!=0){
let node=stack.pop()
if(node!==null){
arr.push(node.val)
}
else{
continue
}
stack.push(node.left)
stack.push(node.right)
}
let left=0
let right=arr.length-1
while(left<right){
let x=arr[left]
arr[left]=arr[right]
arr[right]=x
left++
right--
}
return arr
};