C++创建二叉树

递归创建二叉树的方法:

#include<iostream>
using namespace std;

struct BiNode{
  char data;
  BiNode *lchild, *rchild;
};

void CreateBinaryTree(BiNode **T) {
  char ch;
  cin >> ch;
  //递归的终止条件,如果输入#号创建空指针,说明当前节点左子树已创建完毕
  if (ch == '#')
    *T = NULL;
  else {
    *T = (BiNode *)malloc(sizeof(BiNode));
    (*T)->data = ch;
    //左子树创建完成之后,才会去创建右子树,而不是左右子树同时创建
    CreateBinaryTree(&((*T)->lchild));
    CreateBinaryTree(&((*T)->rchild));
  }
}

//前序遍历
void PreOrderTraversal(BiNode * BT) {
  if (BT) {
    cout << BT->data << "  ";
    //左子树遍历完成之后才会继续往下走
    PreOrderTraversal(BT->lchild);
    //这一步和上一步不是并列关系,必须等上一步执行完,才会往下走
    //当然,既然是递归,在左子树遍历的时候,在那里面又会遍历左子树节点的右子树
    PreOrderTraversal(BT->rchild);
  }
}

//中序遍历
void InOrderTraversal(BiNode *BT) {
  if (BT) {
    InOrderTraversal(BT->lchild);
    cout << BT->data << "  ";
    InOrderTraversal(BT->rchild);
  }
}

//后序遍历
void PostOrderTraversal(BiNode *BT) {
  if (BT) {
    PostOrderTraversal(BT->lchild);
    PostOrderTraversal(BT->rchild);
    cout << BT->data << "  ";
  }
}

int main()
{
  BiNode *root;
  //root本身是指针,再取地址就是二级指针
  CreateBinaryTree(&root);

  //访问二叉树,不需要改变它什么,直接传root进去即可。
  PreOrderTraversal(root);
  cout << endl;
  InOrderTraversal(root);
  cout << endl;
  PostOrderTraversal(root);
  cout << endl;

  system("pause");
  return 0;
}

测试数据:

ABD###C#F##

测试结果:

A       B       D       C       F

D       B       A       C       F

D       B       F       C       A

创建出的二叉树为:

创建顺序为:

 

为什么会创建成这样?

先创建左子树,左子树创建完毕之后才会再创建右子树,虽然代码上看起来两者并列在一起,但是两者不是同步创建的。所以,创建过程是这样的:

  1. A是根节点,B是A的左根;

  2. D是B的左根;

  3. 第一个#是D的左根。遇到空节点,说明D的左子树创建完毕,继续给D创建右子树;

  4. 第二个#是D的右根;

  5. 回退,第三个#又给B创建一个创建一个空的右根;

  6. A的整个左子树创建完毕,接下来创建右子树;

  7. C是A的右根,继续给C创建左子树;

  8. 第4#给C创建空的左子树;

  9. 给C创建右子树F;

  10. 给F创建左子树为空;

  11. 给F创建右子树为空;

  12. 整棵树创建完毕。

 参考:创建二叉树——有趣的递归

欢迎关注上述微信公众号,如有错误可帮忙指正。 

  • 8
    点赞
  • 79
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值