二叉链表生成二叉树

把例程敲一遍       才对二叉树有了个基本的认识    

完整正确例程:

[cpp]  view plain  copy
  1. #include <iostream>  
  2. #include<stdlib.h>  
  3. using namespace std;  
  4. //二叉树出的二叉链表结构定义  
  5. struct bitnode  
  6. {  
  7.     char data;  
  8.     bitnode *lchild,*rchild;  
  9.   
  10. };  
  11.   
  12.   
  13.   
  14. bitnode *t;  
  15. //bitree==*bitnode  
  16. //前序遍历递归  
  17. void preordertraverse(bitnode *t)  
  18. {  
  19.     if(t==NULL)  
  20.         return ;  
  21.     cout<<t->data;  
  22.     preordertraverse(t->lchild);  
  23.     preordertraverse(t->rchild);  
  24. }  
  25.   
  26. //二叉树的中序遍历递归  
  27. void inordertraverse(bitnode *t)  
  28. {  
  29.     if(t==NULL)  
  30.         return ;  
  31.     inordertraverse(t->lchild);  
  32.     cout<<t->data;  
  33.   
  34.     inordertraverse(t->rchild);  
  35. }  
  36. //二叉树后序遍历递归  
  37. void postordertraverse(bitnode *t)  
  38. {  
  39.     if(t==NULL)  
  40.         return ;  
  41.     postordertraverse(t->lchild);  
  42.     postordertraverse(t->rchild);  
  43.     cout<<t->data;  
  44. }  
  45. //按前序输入二叉树中结点的值(一个字符)  
  46. //#表示空树,构造二叉链表表示二叉树t《大话数据结构》  
  47.   
  48. void createbitree(bitnode *(*t))  
  49. {  
  50.     char ch;  
  51.   
  52.     cin>>ch;  
  53.     if(ch=='#')  
  54.         (*t)=NULL;  
  55.     else  
  56.     {  
  57.         (*t)=new bitnode;  
  58.         //if(!t)  
  59.            // exit(0);  
  60.   
  61.         (*t)->data=ch;  
  62.         createbitree(&(*t)->lchild);//构造左子树  
  63.         createbitree(&(*t)->rchild);//构造右子树  
  64.     }  
  65. }  
  66.   
  67.   
  68. int main()  
  69. {  
  70.       
  71.         cout<<"请输入全部结点(空指针用#代替):"<<endl;  
  72.     createbitree(&t);  
  73.     cout<<"\n\n先序遍历"<<endl;  
  74.     inordertraverse(t);  
  75.         cout<<"\n中序遍历"<<endl;  
  76.     preordertraverse(t);  
  77.         cout<<"\n后序遍历"<<endl;  
  78.     postordertraverse(t);  
  79.  cout<<endl;  
  80.     return 0;  
  81. }  

下面是运行结果:


错误的建树函数:

错误原因是:参数有单向传递的特点,修改后的data无法传递到主函数中

[cpp]  view plain  copy
  1. void createbitree(bitnode *t)  
  2. {  
  3.     char ch;  
  4.   
  5.     cin>>ch;  
  6.     if(ch=='#')  
  7.         t=NULL;  
  8.     else  
  9.     {  
  10.         t=new bitnode;  
  11.         //if(!t)  
  12.            // exit(0);  
  13.   
  14.         t->data=ch;  
  15.         createbitree(t->lchild);//构造左子树  
  16.         createbitree(t->rchild);//构造右子树  
  17.     }  
  18. }*/  


修改指针的值:二级指针,引用,返回值(返回修改后的指针)

[cpp]  view plain  copy
  1. 1传引用/  
  2.   
  3.   /*在主函数中定义树,然后传到createbitree中 
  4. void createbitree(bitnode &t) 
  5. { 
  6.     char ch; 
  7.  
  8.     cin>>ch; 
  9.     if(ch=='#') 
  10.         t=NULL; 
  11.     else 
  12.     { 
  13.         t=new bitnode; 
  14.         //if(!t) 
  15.            // exit(0); 
  16.  
  17.         t->data=ch; 
  18.         createbitree(t->lchild);//构造左子树 
  19.         createbitree(t->rchild);//构造右子树 
  20.     } 
  21. } 
  22. main函数中改为:createbitree(t); 
  23.   
  24.  2 //返回值: 
  25.  
  26.   /*直接在函数中定义树; 
  27. bitnode * createbitree() 
  28. { 
  29.    bitnode *t; 
  30.     char ch; 
  31.  
  32.     cin>>ch; 
  33.     if(ch=='#') 
  34.         t=NULL; 
  35.     else 
  36.     { 
  37.         t=new bitnode; 
  38.         //if(!t) 
  39.            // exit(0); 
  40.  
  41.         t->data=ch; 
  42.         createbitree(t->lchild);//构造左子树 
  43.         createbitree(t->rchild);//构造右子树 
  44.  
  45.   } 
  46.   return t; 
  47. } 
  48.  
  49.   主函数:createbitree(); 
  50.  
  51.  
  52. */  
  53.   
  54. //按前序输入二叉树中结点的值(一个字符)  
  55. //#表示空树,构造二叉链表表示二叉树t《大话数据结构》  
  56. void createbitree(bitnode *(*t))  
  57. {  
  58.     char ch;  
  59.   
  60.     cin>>ch;  
  61.     if(ch=='#')  
  62.        (*t)=NULL;  
  63.     else  
  64.     {  
  65.         (*t)=new bitnode;  
  66.         //if(!t)  
  67.            // exit(0);  
  68.   
  69.         (*t)->data=ch;  
  70.         createbitree(&(*t)->lchild);//构造左子树  
  71.         createbitree(&(*t)->rchild);//构造右子树  
  72.     }  
  73. }  
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 设计函数: bool isEqual(BiTree T1, BiTree T2) 功能:判断两个二叉树是否相等 输入参数:T1和T2分别为两个二叉树的根节点指针 输出参数:如果两个二叉树相等,返回true;否则返回false 算法思路: 1. 如果两个二叉树都为空,则它们相等,返回true 2. 如果两个二叉树中有一个为空,另一个不为空,则它们不相等,返回false 3. 如果两个二叉树的根节点的值不相等,则它们不相等,返回false 4. 递归判断左子树和右子树是否相等,如果都相等,则它们相等,返回true;否则返回false 代码实现: bool isEqual(BiTree T1, BiTree T2) { if (T1 == NULL && T2 == NULL) // 两个二叉树都为空 return true; else if (T1 == NULL || T2 == NULL) // 两个二叉树中有一个为空 return false; else if (T1->data != T2->data) // 两个二叉树的根节点的值不相等 return false; else // 递归判断左子树和右子树是否相等 return isEqual(T1->lchild, T2->lchild) && isEqual(T1->rchild, T2->rchild); } 测试函数: void test() { BiTree T1, T2; // 构造两个二叉树 createBiTree(T1); createBiTree(T2); // 判断两个二叉树是否相等 if (isEqual(T1, T2)) cout << "两个二叉树相等" << endl; else cout << "两个二叉树不相等" << endl; } 注意事项: 1. 在测试函数中,需要先构造两个二叉树 2. 在构造二叉树时,可以手动输入节点的值,也可以随机生成节点的值 3. 在测试函数中,需要注意输出的结果,以便判断函数是否正确 ### 回答2: 二叉链表是一种常见的二叉树存储结构,它可以用来表示一个二叉树。在二叉链表中,每个节点包含三个部分:数据域、左子节点和右子节点,其中左子节点和右子节点也是一个二叉链表节点。因此,二叉链表的每个节点都可以看成是一个子树的根节点,而整棵二叉树则由根节点来表示。 在二叉链表的基础上,可以设计一个函数来判断两个二叉树是否相等。这个函数可以采用递归的方式,分别比较两个二叉树的根节点、左子树和右子树是否相等。具体实现方法如下: 1. 如果两个二叉树都为空,则认为它们相等,返回 true。 2. 如果其中一个二叉树为空,另一个二叉树不为空,则认为它们不相等,返回 false。 3. 如果两个二叉树的根节点的值不相等,则认为它们不相等,返回 false。 4. 如果两个二叉树的根节点的值相等,则递归比较它们的左子树和右子树是否相等。 5. 如果两个二叉树的左子树和右子树都相等,则认为它们相等,返回 true。 下面是具体的实现代码: bool isEqual(BiTree tree1, BiTree tree2) { if (tree1 == NULL && tree2 == NULL) { return true; } else if (tree1 == NULL || tree2 == NULL) { return false; } else if (tree1->data != tree2->data) { return false; } else { return isEqual(tree1->left, tree2->left) && isEqual(tree1->right, tree2->right); } } 在代码中,BiTree 表示二叉树节点的类型,包括一个数据域和左右子节点指针。如果两个二叉树都为空,则认为它们相等,返回 true;否则,判断其中一个二叉树是否为空,如果是,则它们不相等,返回 false;如果两个二叉树的根节点的值不相等,则认为它们不相等,返回 false;如果两个二叉树的根节点的值相等,则递归比较它们的左子树和右子树是否相等。如果两个二叉树的左子树和右子树都相等,则认为它们相等,返回 true。 为了测试函数的正确性,可以编写一些测试数据,分别比较两个二叉树的相等性。例如: // 测试数据1 BiTree tree1 = createTree1(); BiTree tree2 = createTree1(); bool result1 = isEqual(tree1, tree2); print(result1); // true // 测试数据2 BiTree tree3 = createTree2(); bool result2 = isEqual(tree1, tree3); print(result2); // false // 测试数据3 BiTree tree4 = NULL; bool result3 = isEqual(tree1, tree4); print(result3); // false 上述测试数据中,第一个测试数据表示两个相同的二叉树,第二个测试数据表示两个不同的二叉树,第三个测试数据表示一个二叉树和一个空二叉树的比较。测试结果表明,函数的实现正确,可以用来判断两个二叉树是否相等。 ### 回答3: 二叉链表是一种常用的二叉树存储结构,它通过定义二叉树的节点结构体来实现二叉树的存储和操作。在二叉链表中,每个节点包含三个字段:data、leftChild、rightChild,分别表示该节点所保存的数据和其左右孩子节点的指针。 当需要判断两个二叉树是否相等时,可以采用递归的方式,从二叉树的根节点开始依次判断每个节点的data值是否相等,以及其左右孩子节点是否相等。如果两个二叉树的所有节点data值和孩子节点都相等,则判定两个树相等。 下面是一个用C语言实现的判断两个二叉树是否相等的函数: ``` typedef struct TreeNode { int data; struct TreeNode *leftChild; struct TreeNode *rightChild; } TreeNode; int isEqual(TreeNode *root1, TreeNode *root2) { if (!root1 && !root2) { // 两个节点都为空 return 1; } if (!root1 || !root2) { // 一个节点为空,一个节点非空 return 0; } if (root1->data != root2->data) { // 节点data值不相等 return 0; } return isEqual(root1->leftChild, root2->leftChild) && isEqual(root1->rightChild, root2->rightChild); // 递归判断左右孩子节点是否相等 } ``` 这个函数定义了一个isEqual()函数,它接收两个TreeNode类型的指针作为参数,分别表示待比较的两个二叉树的根节点。函数中采用递归的方式判断两个二叉树的每个节点是否相等,直到判断完整棵树。如果两个二叉树相等,则函数返回1,否则返回0。 为了测试这个函数的正确性,需要准备两个二叉树作为输入参数并分别传入函数中,然后比较函数的返回值是否与预期结果相同。下面是一组用例: ``` int main() { // 构造测试用例1 TreeNode *root1 = (TreeNode*)malloc(sizeof(TreeNode)); // 分配根节点内存 root1->data = 1; root1->leftChild = (TreeNode*)malloc(sizeof(TreeNode)); // 分配左孩子节点内存 root1->leftChild->data = 2; root1->leftChild->leftChild = NULL; // 左孩子节点无左孩子 root1->leftChild->rightChild = NULL; // 左孩子节点无右孩子 root1->rightChild = (TreeNode*)malloc(sizeof(TreeNode)); // 分配右孩子节点内存 root1->rightChild->data = 3; root1->rightChild->leftChild = NULL; // 右孩子节点无左孩子 root1->rightChild->rightChild = NULL; // 右孩子节点无右孩子 // 构造测试用例2 TreeNode *root2 = (TreeNode*)malloc(sizeof(TreeNode)); // 分配根节点内存 root2->data = 1; root2->leftChild = (TreeNode*)malloc(sizeof(TreeNode)); // 分配左孩子节点内存 root2->leftChild->data = 2; root2->leftChild->leftChild = NULL; // 左孩子节点无左孩子 root2->leftChild->rightChild = NULL; // 左孩子节点无右孩子 root2->rightChild = (TreeNode*)malloc(sizeof(TreeNode)); // 分配右孩子节点内存 root2->rightChild->data = 3; root2->rightChild->leftChild = NULL; // 右孩子节点无左孩子 root2->rightChild->rightChild = NULL; // 右孩子节点无右孩子 // 调用isEqual()函数比较两个二叉树是否相等 int result = isEqual(root1, root2); if (result) { printf("两个二叉树相等。\n"); } else { printf("两个二叉树不相等。\n"); } return 0; } ``` 这组用例定义了两棵具有相同结构和数据的二叉树,并将它们作为参数传入isEqual()函数中进行比较。因为这两棵树相等,所以函数的返回值为1,可以输出“两个二叉树相等”来验证函数的正确性。 使用二叉链表作为二叉树的存储结构,比较二叉树是否相等的函数可以使用递归的方式实现,其时间复杂度为O(n),其中n为两个二叉树的节点总数。建议在实际应用中,可以将该函数封装成一个独立的库函数或模块,并进行严格的单元测试和功能测试,以保证其正确性和稳定性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值