二叉树的创建及各种遍历

#include"stdio.h"
#include"string.h"
#include<stdlib.h>
#include<malloc.h>
//#include<system>
#define Max 20 /*结点的最大个数*/
typedef struct node{
  char data;
  struct node *lchild,*rchild;
}BinTNode; /*自定义二叉树的结点类型*/
typedef BinTNode *BinTree; /*定义二叉树的指针*/
int NodeNum,leaf; /*NodeNum为结点数,leaf为叶子数*/
/*==========基于先序遍历算法创建二叉树============== */
/*=====要求输入先序序列,其中加入虚结点"#"以示空指针的位置========== */
BinTree CreatBinTree(void)
{
  BinTree T;
  char ch;
  if((ch=getchar())=='#')
  return(NULL); /*读入#,返回空指针 */
  else{  
  T=(BinTNode *)malloc(sizeof(BinTNode)); /*生成结点*/
  T->data=ch;
  T->lchild=CreatBinTree(); /*构造左子树*/
  T->rchild=CreatBinTree(); /*构造右子树*/
  return(T);
  }
}
/*========NLR 先序遍历============= */
void Preorder(BinTree T)
{
  if(T) {
  printf("%c",T->data); /*访问结点*/
  Preorder(T->lchild); /*先序遍历左子树*/
  Preorder(T->rchild); /*先序遍历右子树*/
  }
}

/*========LNR 中序遍历===============*/
/*==============中序遍历================== */
void Inorder(BinTree T)
{
  if(T) {
  Inorder(T->lchild); /*中序遍历左子树*/
  printf("%c",T->data); /*访问结点*/
  Inorder(T->rchild); /*中序遍历右子树*/
  }
}

/*==========LRN 后序遍历============ */
/*==============后序遍历===================*/
void Postorder(BinTree T)
{
  if(T) {
   
  Postorder(T->lchild); /*后序遍历左子树*/
  Postorder(T->rchild); /*后序遍历右子树*/
printf("%c",T->data); /*访问结点*/
  }
}

/*=====采用后序遍历求二叉树的深度、结点数及叶子数的递归算法======== */
int TreeDepth(BinTree T)
{
  int hl,hr,max;
  if(T){
  hl=TreeDepth(T->lchild); /*求左深度*/
  hr=TreeDepth(T->rchild); /*求右深度*/
  max=hl>hr? hl:hr; /*取左右深度的最大值*/
  NodeNum=NodeNum+1; /*求结点数*/
  if(hl==0&&hr==0) leaf=leaf+1; /*若左右深度为0,即为叶子。*/
  return(max+1);
  }
  else return(0);
}
/*====利用"先进先出"(FIFO)队列,按层次遍历二叉树==========*/
void Levelorder(BinTree T)
{
  int front=0,rear=1;
  BinTNode *cq[Max],*p; /*定义结点的指针数组cq */
  cq[1]=T; /*根入队*/
  while(front!=rear)
  {
  front=(front+1)%NodeNum;
  p=cq[front]; /*出队 */
  printf("%c",p->data); /*出队,输出结点的值 */
  if(p->lchild!=NULL){
  rear=(rear+1)%NodeNum;
  cq[rear]=p->lchild; /*左子树入队 ( 指针替换)*/
  }
  if(p->rchild!=NULL){
  rear=(rear+1)%NodeNum;
  cq[rear]=p->rchild; /*右子树入队*/
  }
  }
}
/*==========主函数=================*/
void main()
{
  BinTree root;
  int i,depth;
  printf("\n");
printf("Creat Bin_Tree; Input preorder:"); /*输入完全二叉树的先序序列,*/
  /* 用#代表虚结点,如ABD###CE##F## */
  root=CreatBinTree(); /*创建二叉树,返回根结点*/
  do { /*从菜单中选择遍历方式,输入序号。*/
  printf("\t********** select ************\n");
  printf("\t1: Preorder Traversal\n");  
  printf("\t2: Iorder Traversal\n");
  printf("\t3: Postorder traversal\n");
  printf("\t4: PostTreeDepth,Node number,Leaf number\n");
  printf("\t5: Level Depth\n"); /*按层次遍历之前,先选择4,求出该树的结点数*/
  printf("\t0: Exit\n");
  printf("\t*******************************\n");
  scanf("%d",&i); /*输入菜单序号(0-5) */
  switch (i){
  case 1: printf("Print Bin_tree Preorder: ");
  Preorder(root); /*先序遍历 */
  break;
  case 2: printf("Print Bin_Tree Inorder: ");
  Inorder(root); /*中序遍历*/
  break;
  case 3: printf("Print Bin_Tree Postorder: ");
  Postorder(root); /*后序遍历*/
  break;
  case 4: depth=TreeDepth(root); /*求树的深度及叶子数*/
  printf("BinTree Depth=%d BinTree Node number=%d",depth,NodeNum);
  printf(" BinTree Leaf number=%d",leaf);
  break;
  case 5: printf("LevePrint Bin_Tree: ");
  Levelorder(root); /*按层次遍历 */
  break;
  default: exit(1);
  }
  printf("\n");
  } while(i!=0);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
非常感谢您的提问!关于二叉树创建遍历方法,我可以详细地为您介绍。 二叉树是一种树形结构,它的每个节点最多只有两个子节点。二叉树通常用于数据搜索和排序,因为在二叉树中查找和插入的速度非常快。 要创建一个二叉树,首先需要定义二叉树节点的结构,包括数据成员和指针。 struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) {} }; 其中,val 表示节点的值,left 和 right 分别指向左右子节点。 然后,可以使用递归的方式创建二叉树。代码如下: TreeNode* createTree() { int val; cin >> val; if (val == -1) return NULL; TreeNode* root = new TreeNode(val); root->left = createTree(); root->right = createTree(); return root; } 这里使用 -1 表示空节点,如果输入的值是 -1,则返回空节点。 遍历二叉树有三种方式:前序遍历、中序遍历和后序遍历。它们的区别在于遍历的顺序不同。 前序遍历遍历根节点,然后遍历左子树,最后遍历右子树。代码如下: void preOrder(TreeNode* root) { if (!root) return; cout << root->val << " "; preOrder(root->left); preOrder(root->right); } 中序遍历遍历左子树,然后遍历根节点,最后遍历右子树。代码如下: void inOrder(TreeNode* root) { if (!root) return; inOrder(root->left); cout << root->val << " "; inOrder(root->right); } 后序遍历遍历左子树,然后遍历右子树,最后遍历根节点。代码如下: void postOrder(TreeNode* root) { if (!root) return; postOrder(root->left); postOrder(root->right); cout << root->val << " "; } 以上就是关于二叉树创建遍历的介绍,希望能对您有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值