1. 程式人生 > >資料結構—二叉樹的建立及輸出-遞迴

資料結構—二叉樹的建立及輸出-遞迴

二叉樹的建立及輸出,問題描述:
(1)前序輸入結點,用”#“表示空指標
(2)前序遍歷二叉樹
(3)中序遍歷二叉樹
(4)後序遍歷二叉樹
(5)求二叉樹的長度
(6)求二叉樹的葉子結點

#include<stdlib.h>
#include<stdio.h>
#include<iostream>
using namespace std;
int len=0;
typedef struct BiTreenode
{
 char data;
 struct BiTreenode *lchild, *rchild;
}BiTreenode,*BiTreePoint;
void CreateTree(BiTreePoint &T)//前序建立二叉樹
{
 char ch;
 printf("前序輸入結點:");
 cin>>ch;//ch判斷從鍵盤輸入的字元,並將非#的字元存放在T->data中
 if (ch == '#')//從鍵盤輸入的是#則T為空樹
  T = NULL;
 if(T)//T非空樹的話,將ch的值存放在data域,對T的左、右子樹進行相同的建立操作
 {
  T=(BiTreePoint)malloc(sizeof(BiTreenode));
  T->data=ch;//T的結點
  CreateTree(T->lchild);//左子樹
  CreateTree(T->rchild); //右子樹
 }
}
void PreOrderTree(BiTreePoint &T)//前序遍歷二叉樹
{
 if (T)//判斷T是否為空樹,非空則遍歷這棵樹
 {
  printf("%c ", T->data);//主節點
  PreOrderTree(T->lchild);//左子樹
  PreOrderTree(T->rchild);//右子樹
 }
}
void InOrderTree(BiTreePoint &T)//中序遍歷二叉樹
{
 if(T)
 {
  InOrderTree(T->lchild);
  cout<<T->data<<' ';
  InOrderTree(T->rchild);
 }
}
void PostOrderTree(BiTreePoint &T)//後序遍歷二叉樹
{
 if(T)
 {
  PostOrderTree(T->lchild);
  PostOrderTree(T->rchild);
  cout<<T->data<<' ';
 }
}
void LengthTree(BiTreePoint &T)
{
 if(T)
 {
  len++;
  LengthTree(T->lchild);
  LengthTree(T->rchild);
 }
}
void LeavesTree(BiTreePoint &T)
{
 if(T)
 {
  if(!T->lchild&&!T->rchild)
      cout<<T->data<<' ';
  LeavesTree(T->lchild);
  LeavesTree(T->rchild);
 }
}
void main()
{
 BiTreePoint tree;
 printf("前序輸入的結點(葉子結點用#表示其左右結點)\n");
 CreateTree(tree);
 cout<<endl;
 printf("前序遍歷二叉樹的順序:");
 PreOrderTree(tree);
 cout<<endl;
 cout<<"中序遍歷二叉樹的順序:";
 InOrderTree(tree);
 cout<<endl;
 cout<<"後序遍歷二叉樹的順序:";
 PostOrderTree(tree);
 cout<<endl;
 cout<<"所有的葉子結點:";
 LeavesTree(tree);
 cout<<endl;
 LengthTree(tree);
 cout<<"二叉樹的長度為:"<<len<<endl;
 system("pause");
}