二叉树的创建

树形结构是一类重要的非线性数据结构,其中树和二叉树最为重要,那么如何创建二叉树.
 方法1> 可采用树的先序遍历(根左右)的方式创建,从键盘输入树结构的先序遍历的value值即可.
    假设1:我们规定如果键入“/”为空节点,此时树的节点结构val为char类型,此时创建的树结构的所有节点也是char类型.
    假设2:我们规定如果键入"9"为空节点,此时树的节点结构val为int类型,此时创建的树结构的所有节点也是int类型
假设1为例进行编程:

 typedef struct BiTNode{
    char val;
    BiTNode *left;
    BiTNode *right;
  };
//先序遍历创建一个树结构
  bool CreateBiTree(BiTNode * &T)
  {
   char ch;
   std::cout << "Input the value:";
   std::cin >> ch;
   if(ch == '/')
   return true;
   BiTNode *p = new BiTNode();
   if(!p)
   exit(OVERFLOW);
   p->val = ch;
   p->left = p->right = NULL;
   T = p;
     CreateBiTree(T->left);
       CreateBiTree(T->right);
 }
//代码测试
//先序遍历打印结果
 bool PreOrderTraverse(BiTNode *T,void (*visit)(char e))
{
  if(T == NULL){
     std::cout << "/" ;
     return ture;  
}
    visit(T->val);
    PreOrderTraverse(T->right,visit);
} 

void print(char e){
    std::cout << e;  
}

main函数调用者可自己编写。

 

方法一中不难发现如果我们从键盘输入值,必须要设定输入什么value为空节点。也就是说如果我们要创建value是int的二叉树,必然从1到9其中有一个设为

空节点,可在上面代码中更改,创建的二叉树val有一个数值不能用,显然是不符合实际情况,但是如何解决这个问题呢,方法二给出了答案。

方法二>如果考虑要创建二叉树的val为int,double,float类型,则需要创建先序,中序,后序三者中的二个来确定唯一的二叉树.如果要创建这样一个二叉树:

 

           假设1:从中序和后序遍历构造一个树,假设中序数组为vector<int> inorder = {9,3,15,20,7},后序数组为vector<int> postorder = {9,15,7,20,3}

   假设1为例进行编程,由于面向对象编程很方便,我们打算用c++语言进行编程

struct TreeNode{
    int val;
    TreeNode *left;
    TreeNode *right;            
}
class SolutionA{
public:
    //从中序和后序遍历构造二叉树
    TreeNode *buildTree(vector<int> &inorder,vector<int> &postorder)
{
   return buildTree(inorder,0,inorder.size(),postorder,0,postorder.size());    
}    
private:
//具体实现
TreeNode *buildTree(vector<int> &inorder,int inorderL,int inorderR
    vector<int> &postorder,int postorderL,int postorderR)
{
//断言判断,vector为0执行
    if(inorderL >= inorderR)
{
     assert(postorderL >= postorderR);
     return NULL;
}
    if(inorderL + 1 == inorderR){
    assert(postorderL + 1 == postorderR);
   return new TreeNode(inorder[inorderL]);
}
    TreeNode *root = new TreeNode(postorder[postorderR - 1]);
   // 1.找到根节点,在后序遍历中的最后一个
    int rootPos = find(inorder.begin() + inorderL,inorder.begin() + inorderR,root->val) - inorder.begin();
  assert(inorderL <= rootPos && rootPos < inorderR);

  int lsize = rootPos-inorderL;
  int rsize = rootPos-(rootPos+1);
 
 root->left = buildTree(inorder,inorderL,inorderL+lsize,postorder,
postorderL,postorder+lsize);
 root->right = buildTree(inorder,rootPos+1,inorderR,postorder,
postorderL+lsize,postorderR-1);

return root;
}
};
    

main函数调用者可自己编写。这样就能创建一个唯一的二叉树了。

上面代码在本人的机器上编译通过,本人的开发环境是(win10 + vs2013 win32项目),如果测试失败,可能是敲入代码语法错误,并不是思路错误,可随时

私信本人进行更改。

    

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  

转载于:https://www.cnblogs.com/haogod/p/11217687.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值