创建二叉树、创建链表等

 方法一: 1 #include <iostream>//创建二叉树,要用二级指针
 2
 3 using namespace std;
 4
 5 typedef struct TreeNode
 6 {
 7     char data;
 8     struct TreeNode *left;
 9     struct TreeNode *right;
10 }BiTree;
11
12 void creatBitree(BiTree **T)
13 {
14     char ch;
15     cin >> ch;
16     if (ch == ‘#‘)
17     {
18         *T = NULL;
19     }
20     else
21     {
22         *T = (BiTree*)malloc(sizeof(TreeNode));
23         (*T)->data = ch;
24         cout << (*T)->data << endl;
25         creatBitree(&(*T)->left);
26         creatBitree(&(*T)->right);
27     }
28 }
29
30 int main(void)
31 {
32     BiTree *T = NULL;
33     creatBitree(&T);
34
35     return 0;
36 }调试结果:

使用此方法(二级指针)时,在创建函数内部的变量的监视如下:


 方法二: 1 #include <iostream>//这种做法是错的,没有用二级指针,二叉树是创建成功了,但是只在creatBitree中有效,退出该函数就被系统释放了。传递到函数的T只是一个副本。
 2
 3 using namespace std;
 4
 5 typedef struct TreeNode
 6 {
 7     char data;
 8     struct TreeNode *left;
 9     struct TreeNode *right;
10 }BiTree;
11
12 void creatBitree(BiTree *T)//但是这种方法将创建函数的参数改成引用就可以了:void creatBitree(BiTree * &T),(其他地方都不用改)
13 {
14     char ch;
15     cin >> ch;
16     if (ch == ‘#‘)
17     {
18         T = NULL;
19     }
20     else
21     {
22         T = (BiTree*)malloc(sizeof(TreeNode));
23         T->data = ch;
24         cout << T->data << endl;
25         creatBitree(T->left);
26         creatBitree(T->right);
27     }
28 }
29
30 int main(void)
31 {
32     BiTree *T = NULL;
33     creatBitree(T);
34
35     return 0;
36 }调试结果见方法四!!是一样的!!
 方法三:这种方法与前两种不一样的是定义结构体的时候,就定义了一个结构体指针。 1 #include <iostream>
 2
 3 using namespace std;
 4
 5 typedef struct TreeNode
 6 {
 7     char data;
 8     struct TreeNode *left;
 9     struct TreeNode *right;
10 }*BiTree;
11
12 void creatBitree(BiTree *T)//其实此处就相当于一个二级指针,跟方法一类似,此处的BiTree已经是一个指针类型,方法一的只是普通类型。
13 {
14     char ch;
15     cin >> ch;
16     if (ch == ‘#‘)
17     {
18         *T = NULL;
19     }
20     else
21     {
22         *T = (BiTree)malloc(sizeof(TreeNode));
23         (*T)->data = ch;
24         cout << (*T)->data << endl;
25         creatBitree(&(*T)->left);
26         creatBitree(&(*T)->right);
27     }
28 }
29
30 int main(void)
31 {
32     BiTree T = NULL;//此处相当于一个一级指针。
33     creatBitree(&T);//参数是一级指针的地址
34
35     return 0;
36 }调试结果如下:


方法四:其实这种方法跟方法二一样,用一级指针,参数传递时用引用。 1 #include <iostream>
 2
 3 using namespace std;
 4
 5 typedef struct TreeNode
 6 {
 7     char data;
 8     struct TreeNode *left;
 9     struct TreeNode *right;
10 }*BiTree;
11
12 void creatBitree(BiTree &T)
13 {
14     char ch;
15     cin >> ch;
16     if (ch == ‘#‘)
17     {
18         T = NULL;
19     }
20     else
21     {
22         T = (BiTree)malloc(sizeof(TreeNode));
23         T->data = ch;
24         cout << T->data << endl;
25         creatBitree(T->left);
26         creatBitree(T->right);
27     }
28 }
29
30 int main(void)
31 {
32     BiTree T = NULL;
33     creatBitree(T);
34
35     return 0;
36 }调试结果如下:

				
时间: 2024-08-05 15:24:30

创建二叉树、创建链表等的相关文章

c使用二叉链表创建二叉树遇到的一些疑问和思考

二叉链表存储二叉树 学习的时候参考的是<大话数据结构>,书中是这样定义的 typedef char TElemType; typedef struct BiTNode { TElemType data; struct BiTNode *lchild,*rchild; }BiTNode,*BiTree; 结构是这样的,每个节点都存储着当前节点的值,还存储着指向左节点的指针和右节点的指针 typedef 是干什么的 typedef 可以用来定义真实的类型名 一开始我不理解 typedef stru

层次创建二叉树

第一种: 主要是利用 树结点类型的数组.二叉树结点序号之间的关系 来创建: 父结点序号为 i 则,左儿子结点序号为 2*i ,右儿子序号为 2*i+1. //用层次遍历的方法来创建二叉树 #include <iostream> #include <queue> using namespace std; //二叉链表的结构类型定义 const int maxsize=1024; typedef char datatype; typedef struct node { datatype

[数据结构]二叉树创建与遍历

实验报告:二叉树创建与遍历 一.问题描述 二叉树是一种实用范围很广的非线性结构,一棵非空二叉树有也只有一个根结点,每个结点最多有两个子树,我们称为左子树与右子树,当一个结点的左.右子树都是空的时,沃恩称此结点为叶子结点. 二叉树有一些很好的性质,这里不再赘述.考虑如何存储一棵树,本实验选择使用链式存储结构——二叉链表:如果事先知道需要存储的二叉树是满二叉树或者完全二叉树,则可以考虑使用顺序存储,否则将浪费大量的存储空间. 对于一棵既成的二叉树,有三种遍历方式——先序.中序与后序.可以证明,一棵形

创建二叉树来实现指路问题

生活中我们经常会遇到这样的问题,对话如下.路人:“同学,请问湘大图书馆怎么走啊?” 学生:“前面路口左转,然后直走,第三个路口左转,之后再右转就到了.”这里就涉及到创建二叉树来解决此类问题的方法了. 指路法定位结点 从根节点开始: 结点1的位置: { NULL } 结点2的位置: { 左 } 结点3的位置: { 右 } 结点4的位置: { 左,左 } 结点5的位置: { 左,右 } 结点6的位置: { 右,左 } 结点7的位置: { 右,右 } 结点8的位置: { 左,左,左 } 结点9的位置:

中序线索二叉树创建及其遍历

通过考察各种二叉链表,不管儿叉树的形态如何,空链域的个数总是多过非空链域的个数.准确的说,n各结点的二叉链表共有2n个链域,非空链域为n-1个,但其中的空链域却有n+1个.如下图所示. 因此,提出了一种方法,利用原来的空链域存放指针,指向树中其他结点.这种指针称为线索. 记ptr指向二叉链表中的一个结点,以下是建立线索的规则: (1)如果ptr->lchild为空,则存放指向中序遍历序列中该结点的前驱结点.这个结点称为ptr的中序前驱: (2)如果ptr->rchild为空,则存放指向中序遍历

先序遍历创建二叉树,对二叉树统计叶子节点个数和统计深度(创建二叉树时#代表空树,序列不能有误)

#include "stdio.h" #include "string.h" #include "malloc.h" #define NULL 0 #define MAXSIZE 30 typedef struct BiTNode      //定义二叉树数据结构 { char data; struct BiTNode *lchild,*rchild; } BiTNode; void preCreate(BiTNode *& T)   /

创建二叉树 树的深度搜索 广度搜索

树的深度搜索 与树的前序遍历同理 根节点->左孩子->右孩子  树的广度搜索 与树的层次遍历同理 一层一层遍历内容 深度搜索 采用stack的适配器 先进后出原则  而广度搜索采用的queue适配器 先进先出原则 二者正好满足 搜索需求 简要代码如下: #include <iostream> #include <stack> #include <queue> #include <malloc.h> using namespace std; typ

数据结构上机 【创建二叉树,并采用先中后序遍历,输出树高,度数为分别为0 1 2 的结点个数】

#include<stdio.h> #include<string.h> #include<stdlib.h> #include<algorithm> #include<malloc.h> #define null 0 using namespace std; typedef struct node { int data;//节点 node *lchild,*rchild; }node,*Tree; typedef struct{ Tree to

创建单线性链表的不同表示方法和操作

创建单线性链表,常见的有头插法.尾插法创建线性链表,常见的操作有:创建链表.查找.删除.添加元素.求逆链等操作. 这里首先用头插法创建链表: //头指针唯一确定一个单链表 #define MaxSize 15 typedef int elem_type ; typedef struct linklist { elem_type data; struct linklist *next; } Linklist; //头插入法建立链表:每次将头结点的指针赋值给新结点,然后将新节点赋值给头结点指针 Li