赞
踩
第一题 递归:
在正式的递归函数之前用一个void函数来作为后面调用的程序,因为限制条件是没有返回值的,就要用void
前序遍历:
根节点 push 根节点的值 根节点的左孩子 左孩子的值 左孩子的左孩子。。。。。。。。直到最后一层的左孩子的左指针调用函数的时候==NULL了就进入return语句,返回到最后一个左孩子的父亲,走这个程序中的右孩子,右孩子push完,它的左指针==NULL就return,返回到再上面一层,直到返回到根节点,走根节点的右孩子,push完这个右孩子的值就走右孩子的左孩子,重复左树的一切,直到最后一个右孩子走完
中序遍历:
对于整体来说是左中右,根节点,!=NULL,走第一个左孩子!=NULL,继续走左孩子,直到最后一个左孩子的左指针==NULL,return到最后一个左孩子,push这个左孩子的节点值,左孩子的右指针,==NULL,return,最后一个左孩子的程序全部走完,到左孩子的父亲,push这个的节点值,再是它的右孩子,重复,一直到根节点,push根节点的节点值,右孩子进入程序,此时这个第一个右孩子就相当于另外一棵树的根节点了,右孩子的左孩子进入程序,一直左孩子,最后一个左孩子的值push进去,返回父亲然后右孩子进去程序,重复,直到最后一个右孩子
后序遍历:
对于整体来说是左右中
根节点,一直左孩子进入程序,最后一个左孩子的左指针和右指针都==NULL,push该节点值,结束该节点后,进入上一层的父亲节点,右孩子进入程序,右孩子的左指针和右指针都==NULL,push这个右孩子的节点值,返回到父亲节点,右孩子也走完了所以push它的节点值,这个结点结束后就找它的父亲,以此类推,到根节点了,进入第一个右孩子,右孩子又开始找它的左孩子,一直到最后一个,push完它的结点值再找它的父亲,走这个节点的右孩子,push,返回这个父亲节点push它本身的节点值,然后返回这个节点的父亲,再找这个父亲的右孩子,以此类推,最后返回到根节点,push完根节点的节点值,回到最开始的程序层,结束程序的调用
第二题 迭代遍历:
前序遍历:中左右
push根节点 pop出去 push节点值
push根节点的右孩子 左孩子(因为先进后出 整体是中左右)
pop栈顶节点 push其节点值
push栈顶的右孩子 左孩子
一直重复
中序遍历:左中右
设置一个cur等于根节点,push进栈,只要cur->left不为空就一直push左节点进栈
当为空时,就让栈头的结点的值作为处理值,同时弹出这个即将被记录值的结点,节点值进去vec容器,同时设置cur=cur->right,让这个新的cur参与后面的循环
循环里面就是优先处理左节点
后序遍历:左右中
调整一下前序遍历中的左右节点入栈顺序,让左节点先入栈(也就是后出栈),再对整体的vec进行一个翻转即可
第三题:统一迭代
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。