中序遍历二叉树

 #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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值