数据结构:二叉树

树有没有可能用数组实现?

一般的树用数组实现起来是很困难的.

有一种树用数组实现非常方便,那就是完全二叉树.

如图,从上往下给树依次编号,然后用数组存储起来,这是非常容易的.



而且,对于任何一个结点,都可以找出它的父亲结点,左儿子和右儿子.规律如下,可以把任何实例代入下面,都可以验证.   这样来说,这颗完全二叉树就是顺序存储的


对于一般的二叉树呢?可以用类似这种方法实现么?答案是可以的

把一般二叉树补齐成为一颗完全二叉树就可以了,但是会空出很多,空间比较浪费. 以空间为代价.



二叉树的链表结构:


它每个结点的结构体如下:

typedef struct TreeNode *BinTree

typedef BinTree Position

struct TreeNode{

ElementType Data;

BinTree Left;

BinTree Right;

};

其实就是一个表示结点本身信息的数据域(一个或多个普通变量)和两个指针.

树有4种遍历方式

先序遍历,中序遍历,后序遍历和层次遍历

先序遍历:先访问自己再访问左儿子结点,访问左儿子结点的时候,又是先访问自己,再访问左儿子结点,没有左儿子了再访问右儿子.(不懂看看书上的图最好)

对于每个结点都这样,所以我们想到了用递归的方式去做,这里理解递归的话,更好理解程序代码.


中序遍历,后序遍历,都和上面差不多.

这种遍历是采用递归的方式.        对于算法来说,能采用迭代尽量采用迭代,而尽量不采用递归的方式.

我们可以采用非递归用堆栈的方式实现.



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值