非递归遍历二叉树python,二叉树先序遍历的非递归算法具体实现?

用户投稿 101 0

关于“php非递归遍历二叉树”的问题,小编就整理了【3】个相关介绍“php非递归遍历二叉树”的解答:

二叉树先序遍历的非递归算法具体实现?

前序遍历,先根,再左,再右;中序遍历,先左,再根,再右。

前序遍历序列的第一个节点是根节点,记做A,中序遍历中,A之前的是根节点的左子树,A之后的是根节点的右子树。

找出左右子树在前序和中序中的子序列,递归下去即可唯一重构二叉树结构,也就确定了后续遍历的顺序。

参考

Construct Tree from given Inorder and Preorder traversals - GeeksforGeeks

二叉树递归遍历和非递归遍历的优点和缺点?

递归和非递归只是解决问题的方法的不同,本质还是一样的。

2. 递归算法相对于非递归算法来说效率通常都会更低 2.1 递归算法会有更多的资源需要压栈和出栈操作(不仅仅是参数,还有函数地址等)

2.2 由于编译器对附加的一些栈保护机制会导致递归执行的更加低效 3. 使用循环代替递归算法,通常可以获得更好的执行效率和空间效率,在二叉树层次较深的情况下,采用非递归方式遍历能够有效的提升遍历的性能。

树的遍历算法?

中序遍历

中序遍历比较重要,规则为:左子树,根节点,右子树。

一切都是从根节点开始的。

从A开始,因为A有B左子树,所以A不是第一个点。

B子树没有左子树,所以B为根节点,结果为B。我们知道其实一切都是从根节点开始,在这里是A。

在这种排序遍历中,和一个队列有关。

先将A进入队列,队列中为:A;

然后A出队列,输出A,左右子树的B,E进入队列,队列中为:BE。

然后B出队列,输出AB,C进入队列,队列中为:EC。

然后E出队列,输出为ABE,F进入队列,队列中为:CF。

然后c出队列,输入为ABEC,D进入队列,队列中为:FD。

然后F出队列,输入为ABECF,G进入队列,队列为:DG.

然后D出队列,然后输入为ABECFD,队列为:G

然后G出队列,然后输入为ABECFDG,队列为:HK

然后HK分别出队列,输出为ABECFDGHK。

1.先序遍历非递归算法

#define

maxsize

100

typedef

struct

{

Bitree

Elem[maxsize];

int

top;

}SqStack;

void

PreOrderUnrec(Bitree

t)

{

SqStack

s;

StackInit(s);

p=t;

while

(p!=null

!StackEmpty(s))

{

while

(p!=null)

//遍历左子树

{

visite(p->data);

push(s,p);

p=p->lchild;

}//endwhile

if

(!StackEmpty(s))

//通过下一次循环中的内嵌while实现右子树遍历

{

p=pop(s);

p=p->rchild;

}//endif

}//endwhile

}//PreOrderUnrec

2.中序遍历非递归算法

#define

maxsize

100

typedef

struct

{

Bitree

Elem[maxsize];

int

top;

}SqStack;

void

InOrderUnrec(Bitree

t)

{

SqStack

s;

StackInit(s);

p=t;

while

(p!=null

!StackEmpty(s))

到此,以上就是小编对于“php非递归遍历二叉树”的问题就介绍到这了,希望介绍关于“php非递归遍历二叉树”的【3】点解答对大家有用。

抱歉,评论功能暂时关闭!