文章目录
一、遍历
1. 前序遍历
leetcode 144. Binary Tree Preorder Traversal
https://leetcode.com/problems/binary-tree-preorder-traversal/
先访问根节点,再序遍历左子树,最后序遍历右子树
思路
和中序其他都相似,要先访问根节点要后访问左节点,所以在根节点入栈的时候加入result数组
- 特殊情况:根节点为空,返回空数组
- 利用
栈
来存放访问过的根节点——定义一个指针
指向要访问的节点,先访问根节点。将遍历到的结点值存入result数组
,结点存入栈
中。 - stack存放遍历过的根,左节点,
以便回溯访问右节点
- 然后指针一直向下访问
左节点
- 当根节点没有左节点时,将根节点退栈,然后指针指向
右节点
,访问右节点 - 直到栈为空而且指针为空,所有节点遍历完成,退出循环,返回结果
var preorderTraversal = function(root) {
if (root === null) return []; //空树
var result = [],
stack = []; //result储存结果,stack存放遍历过的根,左节点,以便回溯访问右节点
var p = root; //p指向当前遍历的节点
//当有未访问的右节点(stack不空)||还有左节点没有访问(p不空)时进入循环
while (stack.length != 0 || p != null) {
//还有左节点没有访问(p不空)
if (p != null) {
result.push(p.val); //遍历根节点
stack.push(p); //把遍历过的节点放入stack保管
p = p.left; //访问左节点
}
//左节点访问完
else {
p = stack.pop().right; //栈顶节点退栈,访问右节点
}
}
return result;
};
2. 中序遍历
leetcode 94. Binary Tree Inorder Traversal
https://leetcode.com/problems/binary-tree-inorder-traversal/
先中序遍历左子树,再访问根节点,最后中序遍历右子树
思路
和前序其他都相似,左节点要先访问根节点要后访问,所以在根节点出栈的时候加入result数组
- 特殊情况:根节点为空,返回空数组
- 利用
栈
来存放访问过的根节点——定义一个指针
指向要访问的节点,先访问根节点。,结点存入栈
中。 - stack存放遍历过的根,左节点,
以便回溯访问右节点
- 然后指针一直向下访问
左节点
- 当根节点没有左节点时,将根节点退栈,将遍历到的
结点值存入result数组
,然后指针指向右节点
,访问右节点 - 直到栈为空而且指针为空,所有节点遍历完成,退出循环,返回结果
var inorderTraversal = function(root) {
if (root === null) return []; //空树
var result = [],
stack = []; //result储存结果,stack存放遍历过的根,左节点,以便回溯访问右节点
var p = root; //p指向当前遍历的节点
//当有未访问的右节点(stack不空)||还有左节点没有访问(p不空)时进入循环
while (stack.length != 0 || p != null) {
//还有左节点没有访问(p不空)
if (p != null) {
stack.push(p); //把遍历过的节点放入stack保管
p = p.left; //访问左节点
}
//左节点访问完
else {
let node = stack.pop();//栈顶节点退栈,
result.push(node.val); //遍历左节点-根节点
p = node.right; //访问右节点
}
}
return result;
};
3. 后序遍历
leetcode 94. Binary Tree Inorder Traversal
https://leetcode.com/problems/binary-tree-postorder-traversal/submissions/
先后序遍历左子树,再后序遍历右子树,最后访问根节点