mysql 实现非递归树_树遍历和非递归

利用随机函数产生80个(不大于200且各不相同的)随机整数,用这些整数来生成一棵二树,分别对二叉树进行先序遍历,中序遍历和后序列遍历输出树中结点元素序列。注意:先序遍历输出要求采用非递归来实现。

(2)程序实现的基本思想

1.建立合适的二叉树

程序是以

322915264adcf584843f717fd4409f57.png图1.1

的形式建立的。

2.前序遍历是以stack栈和指针左右子女实现的。

3.前序遍历,中序遍历,后序遍历分别用了递归实现。

4.如建立二叉树,其中随机产生的数值是(因为80个数比较多,所以就以#define Max_size 10,若要以80个数,可#define Max_size 10改成#define Max_size 80):

106   199   95   144   102   164   26   96   87   168

由以上数值可以建立出以下的树:

c5611765e8cbb476c37b3564216c3e2e.png图1.2

由图1.2可得出他们的前序,中序和后序。

前序序列:106   95   26   87   102   96   199   144   164   168

中序序列:26    87   95   96   102   106 144   164   168   199

后序序列:87    26   96   102 95    168 164   144   199   106

(3)系统流程图

e05dfa8fa55fd4cb123a081f401b4dca.gif

程序步骤:

#include "stdio.h"

#include "conio.h"

#define Max_size 10    /*声明要产生的不同的随机数*/

struct tree    /*声明树的结构*/

{

struct tree *left;

int data;

struct tree *right;

};

typedef struct tree treenode;

typedef treenode *b_tree;        /*声明二叉树链表*/

/*插入二叉树的节点*/

b_tree insert_node(b_tree root,int node)

{

b_tree newnode;

b_tree currentnode;

b_tree parentnode;

newnode=(b_tree)malloc(sizeof(treenode));    /*建立新节点的的内存空间*/

newnode->data=node;

newnode->right=NULL;

newnode->left=NULL;

if(root==NULL)

return newnode;

else

{

currentnode=root;

while(currentnode!=NULL)

{    parentnode=currentnode;

if(currentnode->data>node)           /*值小于上一根节点的就插入到左孩子*/

currentnode=currentnode->left;

else    currentnode=currentnode->right;

}

if(parentnode->data>node)                /*值大于上一根节点的就插入到右孩子*/

parentnode->left=newnode;

else    parentnode->right=newnode;

}

return root;

}

/*建立二叉树*/

b_tree create_btree(int *data,int len)

{

b_tree root=NULL;

int i;

for(i=0;i

root=insert_node(root,data[i]);

return root;

}

void preorder_nonrecursive(b_tree root)

{

b_tree stack[Max_size];

b_tree p;

int top=-1;

int i;

if (root != NULL)

{

top++;                        /* 根节点入栈 */

stack[top] = root;

while (top > -1)              /* 栈不空时循环 */

{

p = stack[top];           /* 出栈并访问该节点 */

top--;

printf("%d\t", p->data);

if (p->right != NULL)     /* 右孩子入栈 */

{

top++;

stack[top] = p->right;

}

if (p->left != NULL)     /* 左孩子入栈 */

{

top++;

stack[top] = p->left;

}

}

}

}

/*二叉树前序遍历--递归*/

void preOrder(b_tree point)

{

if(point!=NULL)

{printf("%d\t",point->data);

preOrder(point->left);

preOrder(point->right);

}

}

/*二叉树中序遍历--递归*/

void inOrder(b_tree point)

{    if(point!=NULL)

{

inOrder(point->left);

printf("%d\t",point->data);

inOrder(point->right);

}

}

/*二叉树后序遍历--递归*/

void postOrder(b_tree point)

{

if(point!=NULL)

{

postOrder(point->left);

postOrder(point->right);

printf("%d\t",point->data);

}

return;

}

/*主函数*/

main()

{

b_tree root=NULL;

int i,j;

int value;

int nodelist[Max_size];

printf("\nThe elements of binary tree:\n");

/*读取数值存到数组中*/

srand((unsigned)time( NULL ));

for( i = 0; i

{

nodelist[i]=rand()%200+1;

for(j=0;j

if(nodelist[i]==nodelist[j])

{

nodelist[i]=rand()%200+1;

j=0;

}

printf( "%d\t", nodelist[i]);

}

/*建立二叉树*/

root=create_btree(nodelist,Max_size);

/*前序遍历二叉树--非递归*/

printf("\n\nThe non-inorder traversal result is :\n");

preorder_nonrecursive(root);

/*前序遍历二叉树--递归*/

printf("\nThe inorder traversal result is :\n");

preOrder(root);

/*中序遍历二叉树--递归*/

printf("\nThe inorder traversal result is :\n");

inOrder(root);

/*后序遍历二叉树--递归*/

printf("\nThe postOrder traversal result is :\n");

postOrder(root);

getch();

}

(4)系统运行效果图

58034280ec5777315164efb8fa61e6b1.png

from: http://www.cnblogs.com/yongfeng/archive/2010/02/10/1666927.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值