一、树的构建——非递归方法:
所有的大背景:先判断head是否为空。
1.先序遍历:
把根节点放到栈中
循环:(终止条件:栈为空)
(1)栈中弹出一个节点
(2)打印该节点的值
(3)如果有右节点,把右节点压到栈里;如果有左节点,把左节点压到栈里
思考:
先打印头:【1】头
先压右再压左:通过栈的方法调整顺序变为【2】左 【3】右
合并所有过程【1】头【2】左【3】右
2.后序遍历
把根节点放到栈中
循环:(终止条件:栈为空)
(1)栈中弹出一个节点
(2)把该节点压到收集栈中
(3)如果有左节点,把左节点压到栈里;如果有右节点,把右节点压到栈里
最后再打印收集栈
思考:
先把头拿出来:【1】头
先压左再压右:通过栈的方法调整顺序为【2】右 【3】左
最后通过收集栈来进行逆序:【1】左【2】右【3】头
3.中序遍历
循环(终止条件:栈为空或根节点为空)
(1)循环 把根节点的左边界全压到栈里
(2)栈中弹出一个节点(左边界的最下面)打印值
(3)头节点向右移动
let stack=new Stack();
if(head!==null) {
while(!stack.inEmpty||head!=null){
if(head!=null) {
stack.push(head);
head=head.left
}else{
head=stack.pop();
console.log(head.val);
head=head.right;
}
}
}
思考:
只要有左边界就把所有的左边界压到栈里去,没有左边界的话就找左边界的最后一个节点,把它打印,并且把它置成他的右节点。
【1】左 【2】中 【3】右
相当于整个树被左所覆盖,一直在【1】左【2】头,遇到右的时候就把他搞成【1】左【2】头,只不过是左边先进行,后边再进行。
4.递归方法层序遍历
先判断根节点是否为空,为空直接返回。
准备一个队列,先把根节点放到队列里面去。
检查队列的长度,并出队该长度的节点,出队时该节点有子节点就把他入队。
(判断处于几层:当长度为0时,该层全部出去)
二、树的判断
1.判断树是否为搜索二叉树:(leetcode 98)
搜索二叉树:左<根<右
中序遍历所有的节点,让节点里的值进数组,然后数组从前到后遍历,如果顺序为升序就是搜索二叉树。
2.判断树是否为完全二叉树:
完全二叉树:全满或只有最后一层不满,但要满足从左到右遍满。
条件一:不能有右无左
条件二:如果出现了不满的情况,那么之后的所有节点只能是叶节点
层序遍历所有的节点,判断两个条件是否都满足,一旦出现反例返回false,如果都满足最后返回true;
3.判断树是否为满二叉树:
方法一:
写两个函数,一个判断树的最大深度L,一个统计树的节点个数N,如果发现N=2^L-1,说明是满二叉树。