对二叉树进行遍历时,即将对整个树的遍历不断转换为对每个结点进行同样的遍历。
1.递归思想
思路:
(1)对根结点进行访问;
(2)对根结点的左子树进行先序遍历;
(3)对根结点的右子树进行先序遍历。
代码:
参考:递归遍历二叉树
const TreeNode = {
val: 1,
left: {
val: 2,
left: {
val: 4,
},
right: {
val: 5
}
},
right: {
val: 3,
left: {
val: 6,
},
right: {
val: 7
}
}
};
var preOrderRecur = function(root){
var list = [];
var preOrder = function(root){
if(root === undefined){
return;
}
list.push(root.val)
preOrder(root.left);
preOrder(root.right);
}
preOrder(root);
return list;
}
var list = preOrderRecur(TreeNode);
console.log('递归前序遍历', list);
理解代码,重点在于理解,先序遍历对于每个结点,都是先访问该结点,再访问其左子树,再访问其右子树。
2.迭代思想
一旦对根结点进行访问,便会接着访问它的左孩子,接着便会访问它的左孩子的左孩子… 一直到当前结点的左孩子为空,形成一条左侧链。接着便会访问该结点的右子树 -> 上一层左结点的右子树 … -> …最后一个右结点。先自顶向下的访问左侧链上的各结点,再自底向上的依次遍历每一层上的右子树。即对任意结点进行访问时,都会先沿着该结点左侧分支依次进行访问。
思路:
从整棵二叉树的根结点开始,对于任意结点D,访问D结点,若D的右结点不为空,则将D结点的右结点入栈,继续访问D的左结点,并对该左结点的左右结点进行同样的操作。判断D的左结点是否为空,若为空,则弹出栈顶,若栈为空,则退出算法。
const TreeNode = {
val: 1,
left: {
val: 2,
left: {
val: 4,
},
right: {
val: 5
}
},
right: {
val: 3,
left: {
val: 6,
},
right: {
val: 7
}
}
};
var preOrder = function(root) {
var list = [];
const remStack = [];
while(root) {
while (root) {
list.push(root.val)
if (root.right) {
remStack.push(root.right);
}
root = root.left;
}
if (remStack.length == 0) {
break;
}
root = remStack.pop()
}
return list;
}
console.log(preOrder(TreeNode));