创建二叉树——少见的方法(上篇)

创建二叉树——较为少见的方法(上篇)

先序遍历创建二叉树(较为常见)

网上很多代码都是通过先序遍历创建二叉树(二叉链表)
在输入端我们需要按照先序遍历的顺序输入各结点元素,进而创建一棵树
例如:
在这里插入图片描述
我们通过在草稿纸上分析可得其先序遍历顺序为“ABDEC”
所以在代码实现时,就要在输入端输入“ABD##E##C##”,才能成功创建一颗二叉树。(其后跟两个#的表示其是叶子结点,知道了哪些是叶子结点,我们才能正常结束二叉树的建立)
如果上述对#的解释很抽象,不太理解的话,下面就上代码,结合着代码来分析:

// ----------二叉树结点结构体类型定义
typedef struct BTNode
{
 char data;//结点数据元素
 struct BTNode* lchild;//左孩子指针
 struct BTNode* rchild;//右孩子指针
}BTNode,*BTree;//BTNode代表二叉树中任一结点,BTree代表指向二叉树根结点的指针(相当于单链表中的头指针)
//------------先序遍历创建二叉树
void create(BTree &root)//注意这里为引用型
{
    char ch;
    scanf("%c",&ch);//注意输入的格式,scanf会把换行符读入,所以不能一行一个字符的输入,要将所有字符输入在一行上,这时即使读入换行符也无碍,可以自行输入检验
 if(ch=='#')//如果第一个字符变为#,说明为空树,置为NULL,后面的也就不再执行
  root=NULL;
 else//不为空树时
 {
  root=(BTree)malloc(sizeof(BTNode));//一定不要忘记事先给结点分配存储空间
  (*root).data=ch;
  create((*root).lchild);
  create((*root).rchild);
 }
}

运行结果
为了验证是否创建成功,我利用了三种遍历方式进行输出(这里遍历函数未贴出)
在这里插入图片描述
:这里虽然直接输入了一行,但其是逐字符读取的,因为代码中本身就是单个字符的输入,文中代码:
char ch;
scanf("%c",&ch);

思考下:上述void create(BTree &root)函数中为什么需要用引用型
(注意这里BTree &root)相当于BTNode *&root
答:分析此函数可知,在函数内部涉及到对root的一些操作,比如为其申请内存空间,赋值等,所以可以得出结论:root本身发生了改变。再来复习所学的关于形参和实参的两个知识点:

  1. 形参为非引用型时,相当于是实参的一份拷贝,即形参的改变不会影响实参
  2. 形参为引用型时,形参和实参其实是一个东西,只是名字不同而已,相当于为实参起了一个**“别名”**,名字虽然不同,但都是同一人,所以对形参的改变实际上就是对实参的改变。
    综上,因为我们要对root进行一些操作改变,所以使用引用型。

上述就是常见的方法,为了避免大家长篇阅读和便于理解,将另一种方法写在了下文,上述方法吸收之后,可以查看下文:
https://editor.csdn.net/md?articleId=106160555

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值