链式二叉树

1.链式二叉树的遍历

1.创建

我们在之前说到二叉树的结构还可以为链表的形式,我们虽然没有完成链式二叉树的实现,到那时我们可以直接简单的构造一个出来。

例如;

typedef struct BinTreeNode {//binding沾粘关系
	struct BinTreeNode* left;
	struct BinTreeNode* right;
	int val;

}BTNode;

BTNode* BuyBTNode(int val) {
	BTNode* newnode = (BTNode*)malloc(sizeof(BTNode));
	if (newnode == NULL) {
		perror("malloc fail");
		return ;
	}
	newnode->val = val;
	newnode->left = newnode->right = NULL;
	return newnode;
}
BTNode* createTree() {
	BTNode*n1= BuyBTNode(1);
	BTNode*n2= BuyBTNode(2);
	BTNode*n3= BuyBTNode(3);
	BTNode*n4= BuyBTNode(4);
	BTNode*n5= BuyBTNode(5);
	BTNode*n6= BuyBTNode(6);
	n1->left = n2;
	n1->right = n4;
	n2->left = n3;
	n4->left = n5;
	n4->right = n6;
	return n1;
}

2.前序遍历

所谓的前序遍历其实就是根 左子树  右子树的规律来遍历的。

例如上面我们创建的链式二叉树,如果用前序遍历来的话,就会得到1 2 3 4 5 6 

其实在学这方面的时候哦我们可以加上NULL来方便学习。就会得到1 2 3 N N N 4 5 N N 6 N N

究竟是怎么来的呢?我们来看下:

我们在创建节点时给每个节点两个指针,初始化的时候都是NULL,所以在叶子的底部还有NULL,且2的右子树也是NULL。我们可以利用这来写一个递归函数。

void preOrder(BTNode*root) {//root 根 prv在..前 order 顺序
	if (root == NULL) {
		printf("NULL ");
		return;
	}
	printf("%d ", root->val);
	preOrder(root->left);
	preOrder(root->right);

}

 我们来看下结果是否正确:

3.中序遍历、后序遍历

 中序遍历:左子树 根 右子树

后序遍历:左子树 右子树 根

void InOrder(BTNode* root) {//root 根 prv在..前 order 顺序
	if (root == NULL) {
		printf("NULL ");
		return;
	}
	InOrder(root->left);
	printf("%d ", root->val);	
    InOrder(root->right);

}
void atfOrder(BTNode* root) {//root 根 prv在..前 order 顺序
	if (root == NULL) {
		printf("NULL ");
		return;
	}
	atfOrder(root->left);
	atfOrder(root->right);
printf("%d ", root->val);
} 

4.链式二叉树的字节个数

int TreeSize1(BTNode* root , int *size) {
	
	if (root == NULL) {
		return;
	}
	else
		++(*size);
	TreeSize(root->left,size);
	TreeSize(root->right ,size);
	return *size;
}

那么这里我们为啥要传入一个整型的地址呢?因为我们在不断开辟栈帧的过程中每一个size都是不同的,如果不用指针进行解引用++那么就会发生size只会得到第一次栈帧的++,所以我们在次使用传地址的方式。

还有一种更好的方式,那就是采用后序遍历的思想来写。

int TreeSize(BTNode*root) {

	return root == NULL ? 0 : TreeSize(root->left) + TreeSize(root->right) + 1;
}//经典后序计算方式


5.链式二叉树的高(深度)

注意:一般树的高度都是从1开始计算的,除非题目有要求说明。

//树的高度
int TreeHeight(BTNode* root) {
	if (root == NULL) {
		return 0;
	}
	int leftHeight = TreeHeight(root->left);
	int rightHeight = TreeHeight(root->right);

	return leftHeight > rightHeight ? leftHeight + 1 : rightHeight + 1;
}

这些都是递归代码,大家可以话递归展开图,方便理解。

谢谢
  • 8
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

c23856

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值