#include "stdafx.h"
#include <iostream>
#include<stdlib.h> //后面的malloc要用到
#include<conio.h>
using namespace std;
struct tree //声明树的结构
{
struct tree *left; //该树指向左孩子,左孩子的类型为tree,实际上为struct
int data; //自己本身的一个值
struct tree *right; //还指向一个右孩子,类型同左孩子
};
typedef struct tree treenode; //定义一个根节点,其类型为struct tree,即它有左孩子,右孩子,自己还有个值
//typedef struct treenode;
//treenode *b_tree; //定义一个类型,类似于int之类的
typedef struct tree *b_tree;
//插入二叉树的节点
b_tree insert_node(b_tree root,int node) //root为已经插入了0个或多个节点的树的第一个节点,node为即将要插入的节点的date
{
b_tree newnode; //定义一个新节点
b_tree currentnode; //定义一个现有的节点
b_tree parentnode; //定义一个父节点
newnode=(b_tree)malloc(sizeof(treenode)); //建立新节点的内存空间,给新的根节点分配一个内存空间
newnode->data=node; //新节点的值就是node的值
newnode->right=NULL; //新节点的右孩子是NULL
newnode->left=NULL; //新节点的左孩子也设置为null
if(root==NULL) //如果树还没插入有任何节点,也即该树的第一个节点为空
return newnode; //返回刚刚设置的值为node的值,左右孩子都没有指向的树
else
{ currentnode=root; //如果该树不为空,则将根节点的值赋给currentnode
while(currentnode!=NULL) //当前这棵树不为空
{ parentnode=currentnode; //则当前父节点的值为currentnode
if( currentnode->data<node) //如果但前节点的值小于即将要插入的节点
currentnode=currentnode->right;
else currentnode=currentnode->left;//这段代码是决定其当前节点是父节点的左孩子还是右孩子,并且令其为空
}
if(parentnode->data>node) //这段代码是将新节点插入父节点的左边还是右边
parentnode->left=newnode; //将新节点的值赋给父节点的左孩子
else parentnode->right=newnode; //否则将新节点的值赋给父节点的右孩子
}
return root;
}
// 建立二叉树
b_tree create_btree(int *data,int len) //data包含着输入的树的元素,len是这颗树有多少个节点
{
b_tree root=NULL; //定义一棵树,并初始化其为null
for(int i=0;i<len;i++) //将节点插入,当i小于树的节点数时,停止插入节点
root=insert_node(root,data[i]); //data[i]为第i个节点值
return root; //返回一颗二叉树
}
//二叉树中序遍历
void inorder(b_tree point) //传进去的树首先指针都是指向第一个元素,也即根节点
{
if(point!=NULL) //如果树不为空,即树中有元素
{
inorder(point->left); //指向树的左节点,然后进行递归,一直到左边的最后一个节点,然后将这个节点显示出来
cout<<" "<<point->data;
inorder(point->right);
}
}
//主程序
int main( )
{
b_tree root=NULL;
int i,index;
int value;
int *nodelist = new int();
cout<<endl;
cout<<"Please input the elements of binary tree(exit for 0):"<<endl;
index=0;
//读取数值存到数组中
cin>>value;
while(value!=0) //输入时提示了以0结束
{
nodelist[index++]=value; //nodelist节点列表将输入的数字存入到value数组中
//++index;
cin>>value;
}
//建立二叉树
root=create_btree(nodelist,index);
//中序遍历二叉树
cout<<endl;
cout<<"The inorder traversal result is:"<<endl;
inorder(root);
cout<<endl;
getch();
return 0;
}
36万+

被折叠的 条评论
为什么被折叠?



