打印树1基础.

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/fqbqrr/article/details/102496101

树,还不好打印得.树,这个东西非常重要.一定要搞懂.

首先,树的深度未知,树的子树长度未知
然后,插入新结点后,树就变形了,难道每次插入后,就必须得整个修改吗?
树的递归与非递归.
递归与非递归遍历其实差别就是递归,程序帮你压了一个栈.因而非递归,则只需要把程序帮你压的栈写出来,那么就是非递归了.
多个当一个当,其实,很多程序,根本没有必要多个当(嵌套)当,多个(嵌套)当其实就是一个当,只要你逻辑安排好了,就是一个.因为无穷*无穷==无穷.他们没啥区别.
树的广度优先与深度优先遍历.
广度优先:最直接,最明白,.将第一层压入队列.然后把挨个的将第一层的子加入队列尾,然后挨个的出队列.就遍历了.(一层层的动作).
深度优先:好久没看树了,一时就会搞忘记.想半天的左,根,右.
就是递归方式的深度优先,确实不容易理解.
多个子的打印位置,及一个子的打印位置.实际上如果二叉树,只有一个左树或只有一个右树,与只有一个树是一样的.没必要再去区别左树,右树.这里把二叉树的子树保存为向量<节点*>.而不是单独的节点*左,右.
树的深度优先递归方式:

空 深先(节点*a,整 层){
    打印(a->);//从这里可以看出,一趟只访问了一个(即自己).
    //什么前序,中序,后序就是这两个语句的打断排列而已.(&p:a->子们)深先(p,+1);
}//大致是这样的吧.

参考了这篇文章:套路
主要是,他的套路,我不懂.最后又参考了这篇文章
感觉他最后的一段代码,是比较简单的,但我觉得,他前面一大堆是乱说.搞不懂在说什么.
不过,后来仔细想想,深度优先与广度优先其实是一样的.树嘛,都是树.与那个html树有啥区别?
非递归深先就是自己加一个递归深先的栈,自己把栈写出来而已.反正这个栈是必须写的,跑不脱.,说得多,都是错,别人说了一大堆,结果没搞懂,那就不要看了.折腾.

空 非递归深先(节点*a){//们展示未访问层次,b表当前
    向量<节点*>;整 j,i;节点*b;(1){//这是一种方式,
        j=.大小();(!j);
        b=.();.出后();//等价于弹出栈
        打印(b->);//访问
        逆压(,b->子们);//这是重点,逆压,
    }//递归展开与非递归展开是不一样的.
    //同样,交换这两句的顺序,就变了,根->子,子->根,对了的
    //像递归,是可以的.毕竟是在栈上.
    //要变形的话,把重点句与上个句子,混在一起,想怎么变,就怎么变.
}

树的打印还是难点,树的完全树(满树)这没意义.太大的树,你不可能全打印出来.
而且一旦有新的节点进入,还要相应调整.不可能进来一个结点,调整整个树吧.

就是一个同义复述,模仿自己的变化.
父节点与一堆子节点看成一个大节点,先进入这个大节点,然后想怎么变,怎么变.
然后进入其中一个子节点,再同样的变化.当然,刚才进的那个节点就必须要出来了.有进有出,才有生意.

教科书的写法叫折腾:

空 左半边(节点*p,向量<>&){//最后p为空针(p!=空针){(,s->);s.(p);p=p->;}
}//这是二叉树,把这个当提出来,好理解些
空 先序(节点*r,向量<>&){<节点*>s;节点*p=r;(p!=空针||!s.空的()){
        左半边(p,);(!s.空的()){p=s.();s.();p=p->;}
        //开始p为不含左结点的叶子结点,
        //p->右,可能会是空针(即无右结点).
    }//先访问(本结点,左半边,)然后访问右结点.
}

上面是教科书折腾.

空 深先(节点*a){
    向量<节点*>,;整 j,i;节点*b=a;(1){
        j=.大小();(!j);
        b=.();.出后();//改为弹
        一个排列(,b->子们);//这是子们的排列,多少种耍法就看子的个数.
        打印(b->);//操作(b);//本节点的真正操作
        逆压(,);//重点是逆压,这样,就可以
    }//愉快的玩耍了,妈妈再也不用担心树的遍历了
}//所谓的深先,,其实只是一个排列而已.树的遍历就是很多种.想怎么遍历,怎么遍历.我高兴.
//深先与广先,本质完全不一样.广先是按层次的,即按树高的遍历,

懂起树的玩法没有?先在大节点上以一种方式入队列,然后,取出头节点,进行操作.然后再将本节点的子节点按一定的规律加入队列.简不简单?,就是一个负责加队列,一个负责处理本节点.
最后还是回到标题:如何打印树?.

猜你喜欢

转载自blog.csdn.net/fqbqrr/article/details/102496101