您的位置:首页 > 其它

树遍历和非递归

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

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

1.建立合适的二叉树

程序是以


图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

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


图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)系统流程图



程序步骤:

#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<len;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 <Max_size;i++ )

{

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

for(j=0;j<i;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)系统运行效果图



from: http://www.cnblogs.com/yongfeng/archive/2010/02/10/1666927.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: