数据结构 树相关

一、树的构建——非递归方法:

所有的大背景:先判断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,说明是满二叉树。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值