成语| 古诗大全| 扒知识| 扒知识繁体

当前位置:首页 > 趣味生活

二叉树的遍历算法

Q1:php实现的二叉树遍历算法示例

本文实例讲述了php实现的二叉树遍历算法。分享给大家供大家参考,具体如下:

今天使用php来实现二叉树的遍历

创建的二叉树如下图所示

php代码如下所示:

<?phpclass Node {public $value;public $child_left;public $child_right;}final class Ergodic {//前序遍历:先访问根节点,再遍历左子树,最后遍历右子树;并且在遍历左右子树时,仍需先遍历根节点,然后访问左子树,最后遍历右子树public static function preOrder($root){$stack = array();array_push($stack, $root);while(!empty($stack)){$center_node = array_pop($stack);echo $center_node->value . ;//先把右子树节点入栈,以确保左子树节点先出栈if($center_node->child_right != null) array_push($stack, $center_node->child_right);if($center_node->child_left != null) array_push($stack, $center_node->child_left);}}//中序遍历:先遍历左子树、然后访问根节点,最后遍历右子树;并且在遍历左右子树的时候。仍然是先遍历左子树,然后访问根节点,最后遍历右子树public static function midOrder($root){$stack = array();$center_node = $root;while (!empty($stack)$center_node != null) {while ($center_node != null) {array_push($stack, $center_node);$center_node = $center_node->child_left;}$center_node = array_pop($stack);echo $center_node->value . ;$center_node = $center_node->child_right;}}//后序遍历:先遍历左子树,然后遍历右子树,最后访问根节点;同样,在遍历左右子树的时候同样要先遍历左子树,然后遍历右子树,最后访问根节点public static function endOrder($root){$push_stack = array();$visit_stack = array();array_push($push_stack, $root);while (!empty($push_stack)) {$center_node = array_pop($push_stack);array_push($visit_stack, $center_node);//左子树节点先入$pushstack的栈,确保在$visitstack中先出栈if ($center_node->child_left != null) array_push($push_stack, $center_node->child_left);if ($center_node->child_right != null) array_push($push_stack, $center_node->child_right);}while (!empty($visit_stack)) {$center_node = array_pop($visit_stack);echo $center_node->value . ;}}}//创建二叉树$a = new Node();$b = new Node();$c = new Node();$d = new Node();$e = new Node();$f = new Node();$g = new Node();$h = new Node();$i = new Node();$a->value = https://www.bazhishi.com/aldyjtapi/A;$b->value = https://www.bazhishi.com/aldyjtapi/B;$c->value = https://www.bazhishi.com/aldyjtapi/C;$d->value = https://www.bazhishi.com/aldyjtapi/D;$e->value = https://www.bazhishi.com/aldyjtapi/E;$f->value = https://www.bazhishi.com/aldyjtapi/F;$g->value = https://www.bazhishi.com/aldyjtapi/G;$h->value = https://www.bazhishi.com/aldyjtapi/H;$i->value = https://www.bazhishi.com/aldyjtapi/I;$a->child_left = $b;$a->child_right = $c;$b->child_left = $d;$b->child_right = $g;$c->child_left = $e;$c->child_right = $f;$d->child_left = $h;$d->child_right = $i;//前序遍历Ergodic::preOrder($a); //结果是:A B D H I G C E Fecho
;//中序遍历Ergodic::midOrder($a); //结果是: H D I B G A E C Fecho
;//后序遍历Ergodic::endOrder($a); //结果是: H I D G B E F C A

更多关于PHP感兴趣的读者可查看本站专题:《PHP数据结构与算法教程》、《PHP基本语法入门教程》、《php面向对象程序设计入门教程》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》

希望本文所述对大家PHP程序设计有所帮助。

Q2:二叉树遍历的算法题目

C
/
E
/ \
DB
\
A
1.前序遍历是(根 左 右):CEDBA
A
/ \
BC
// \
DEF
\/
GH
2.后序遍历是(左 右 根):GDBEHFCA

Q3:二叉树后序遍历非递归算法

前序、中序、后序的非递归遍历中,要数后序最为麻烦,如果只在栈中保留指向结点的指针,那是不够的,必须有一些额外的信息存放在栈中。
方法有很多,这里只举一种,先定义栈结点的数据结构
typedefstruct{Node*p;intrvisited;}SNode//Node是二叉树的结点结构,rvisited==1代表p所指向的结点的右结点已被访问过。
lastOrderTraverse(BiTreebt){
//首先,从根节点开始,往左下方走,一直走到头,将路径上的每一个结点入栈。
p=bt;
while(bt){
push(bt,0);//push到栈中两个信息,一是结点指针,一是其右结点是否被访问过
bt=bt.lchild;
}
//然后进入循环体
while(!Stack.empty()){//只要栈非空
sn=Stack.getTop();//sn是栈顶结点
//注意,任意一个结点N,只要他有左孩子,则在N入栈之后,N的左孩子必然也跟着入栈了(这个体现在算法的后半部分),所以当我们拿到栈顶元素的时候,可以确信这个元素要么没有左孩子,要么其左孩子已经被访问过,所以此时我们就不关心它的左孩子了,我们只关心其右孩子。
//若其右孩子已经被访问过,或是该元素没有右孩子,则由后序遍历的定义,此时可以visit这个结点了。
if(!sn.p.rchildsn.rvisited){
p=pop();
visit(p);
}
else//若它的右孩子存在且rvisited为0,说明以前还没有动过它的右孩子,于是就去处理一下其右孩子。
{
//此时我们要从其右孩子结点开始一直往左下方走,直至走到尽头,将这条路径上的所有结点都入栈。
//当然,入栈之前要先将该结点的rvisited设成1,因为其右孩子的入栈意味着它的右孩子必将先于它被访问(这很好理解,因为我们总是从栈顶取出元素来进行visit)。由此可知,下一次该元素再处于栈顶时,其右孩子必然已被visit过了,所以此处可以将rvisited设置为1。
sn.rvisited=1;
//往左下方走到尽头,将路径上所有元素入栈
p=sn.p.rchild;
while(p!=0){
push(p,0);
p=p.lchild;
}
}//这一轮循环已结束,刚刚入栈的那些结点我们不必管它了,下一轮循环会将这些结点照顾的很好。
}
}

Q4:二叉树先序遍历递归算法和非递归算法本质区别?

在前面一文,说过二叉树的递归遍历算法(二叉树先根(先序)遍历的改进),此文主要讲二叉树的非递归算法,采用栈结构
总结先根遍历得到的非递归算法思想如下:
1)入栈,主要是先头结点入栈,然后visit此结点
2)while,循环遍历当前结点,直至左孩子没有结点
3)if结点的右孩子为真,转入1)继续遍历,否则退出当前结点转入父母结点遍历转入1)
先看符合此思想的算法:
[cpp] view plain copy print?
int PreOrderTraverseNonRecursiveEx(const BiTree &T, int (*VisitNode)(TElemType data))
{
if (T == NULL)
{
return -1;
}
BiTNode *pBiNode = T;
SqStack S;
InitStack(&S);
Push(&S, (SElemType)T);
while (!IsStackEmpty(S))
{
while (pBiNode)
{
VisitNode(pBiNode->data);
if (pBiNode != T)
{
Push(&S, (SElemType)pBiNode);
}
pBiNode = pBiNode->lchild;
}
if(pBiNode == NULL)
{
Pop(&S, (SElemType*)&pBiNode);
}
if ( pBiNode->rchild == NULL)
{
Pop(&S, (SElemType*)&pBiNode); //如果此时栈已空,就有问题
}
pBiNode = pBiNode->rchild;
}
return 0;
}

Q5:二叉树先序非递归遍历C语言算法

#include
#include
#define MS 10、struct BTreeNode
{
char data;
struct BTreeNode * left;
struct BTreeNode * right;
};
void InitBTree(struct BTreeNode * * BT)
{
* BT=NULL;
}
void CreatBTree(struct BTreeNode * * BT,char * a)
{
struct BTreeNode * p;
struct BTreeNode * s[MS];
int top=-1;
int k;
int i=0;
* BT=NULL;
while(a[i])
{
switch(a[i])
{
case :break;
case (:
if(top==MS-1)
{
printf("栈空间太小,需增加MS的值!\n");
exit(1);
}
top++;s[top]=p;k=1;
break;
case ):
if(top==-1)
{
printf("二叉树广义表字符串有错!\n");
exit(1);
}
top--;break;
case , : k=2;break;
default :
if((a[i]>=a&&a[i]<=z)(a[i]>=A&&a[i]<=Z))
{
p=malloc(sizeof(struct BTreeNode));
p->data=https://www.bazhishi.com/aldyjtapi/a[i];p->left=p->right=NULL;
if(* BT==NULL) * BT=p;
else
{
if(k==1) s[top]->left=p;
else s[top]->right=p;
}
}
else {printf("二叉树广义表字符串有错!\n");exit(1);}
}
i++;
}
}
void Preorder(struct BTreeNode * BT)
{
structBTreeNode * s[10];
int top=-1;
structBTreeNode * p=BT;
while(top!=-1p!=NULL)
{
while(p!=NULL)
{
top++;
s[top]=p;
printf("%c",p->data);
p=p->left;
}
if(top!=-1)
{
p=s[top];
top--;
p=p->right;
}
}
}
void main()
{
struct BTreeNode * p;
char * a="A(B(C),D(E(F,G),H(,I)))";
InitBTree(&p);
CreatBTree(&p,a);
printf("结点的访问序列为:\n");
Preorder(p);printf("\n");
}

Q6:二叉树层次遍历算法

#include
#include
typedef char datatype;
typedef struct node
{datatype data; struct node *lchild,*rchild; }bitree;
bitree *Q[100];
bitree *creat()
{
bitree *root,*s;
int front,rear;
root=NULL;
char ch;
front=1;rear=0;
ch=getchar();
while(ch!=0)
{
s=NULL;
if(ch!=@)
{s=(bitree *)malloc(sizeof(bitree)); s->data=https://www.bazhishi.com/aldyjtapi/ch; s->lchild=NULL; s->rchild=NULL; }
rear++;
Q[rear]=s;
if(rear==1)
root=s;
else
{
if(s&&Q[front])
if(rear%2==0)
Q[front]->lchild=s;
else
Q[front]->rchild=s;
if(rear%2==1)
front++;
}
ch=getchar();
}
return root;
}
void cengci(bitree *t)
{
bitree *Queue[100],*p;
int front=0,rear=0;
if(t)
{
p=t;
Queue[rear]=p;
rear=(rear+1)%20;
while(front!=rear)
{
p=Queue[front];
printf("%c",p->data);
front=(front+1)%100;
if(p->lchild)
{
Queue[rear]=p->lchild;
rear=(rear+1)%100;
}
if(p->rchild)
{
Queue[rear]=p->rchild;
rear=(rear+1)%20;
}
}
}
}
void main()
{struct node *tree; tree=(bitree *)malloc(sizeof(bitree)); tree=creat(); cengci(tree); }

Q7:c语言编程实现二叉树的三种遍历算法 并针对一个二叉树列出三种遍历序列。功能要求:实现三种遍历算法、

QianXu(T->lChild);
QianXu(T->m=p;
p==ch;rChild))typedefstructBTree
{
intmalloc.h>SumLeaf(BinTree*T)return
if{
chardata;HouXu(BinTree*T)}
}
voidZhongXu(T->sum=0;
p->{
ZhongXu(T->lChild);
printf("
}
voidQianXu(BinTree*T)((!T->lChild)scanf("T->ZhongXu(BinTree*T)}
}
void(;=CreateTree(p->,datach);
}
int%c,";data);rChild1234567891011121314151617181920212223242526272829303132333435363738394041424344454647#include{charch;m;#n;%c,";,,rChild);{if(T)sum+=m+n;}struct,SumLeaf(T->%c"*T){intdep=0,depl,depr;if(!T)dep=0;else{depl=Depth(T->lChild);depr=Depth(T->rChild);dep=1+(depl>depr?depl:depr);}returndep;}voidFreeTree(BinTree*T){if(T){FreeTree(T->lChild);FreeTree(T->rChild);free(T);}}intmain(){BinTree*Tree=NULL;Tree=CreateTree(Tree);//前序遍历printf("QianXuTraversal:");QianXu(Tree);printf("\nZhongXuTraversal:");ZhongXu(Tree);printf("\nHouXuTraversal:");HouXu(Tree);printf("\nLeafsnumber:%d\n",SumLeaf(Tree));printf("TreesDepth:%d",Depth(Tree));FreeTree(Tree);return0;}输入:#ABCD###E##FG#H##I#J##输出:

;returnn=,&{
HouXu(T->lChild);
HouXu(T->rChild);
printf("{
if(T)rChild);
=CreateTree(p->(ch==p->
)returnNULL;sum;T->*rChild;(BinTreeif
SumLeaf(T->}
}
intDepth(BinTree{
if(T)lChildlChild);BTree*lChild;
structBTree
&&data);ifsum++;rChild);*)malloc(sizeof(BinTree));(T){
{
printf(",*CreateTree(BinTree*p)lChild);rChild);T->!T->%c,";
#includedata);}BinTree;
BinTree

猜你喜欢

更多