编写函数求二叉树深度c语言,【数据结构】二叉树的实现(如:默认成员函数、(叶子)节点数、深度、四种遍历)...

本文介绍了使用C语言实现二叉树结构,包括二叉链表结构,并提供了计算二叉树的叶子节点数、深度、节点个数以及四种遍历方法的详细代码实现。
摘要由CSDN通过智能技术生成

二叉树:树的每个节点最多有两个子节点。

我们看下它的结构,有二叉链表结构与三叉链表结构,具体结果如我摘自《C++Primer》中的图。

1c3fb87844adba867ef984c55257d20e.png

相比之下,三叉链表的优势在于当我们知道父亲节点要找他的子女节点比较方便和便捷,反之当我们知道子女节点找它的父亲节点时也方便。

下面,我实现下二叉链表的结构。template 

struct BinaryTreeNode

{

BinaryTreeNode* _left;    //左子树

BinaryTreeNode* _right;    //右子树

T _data;

BinaryTreeNode(const T& x)

:_left(NULL)

, _right(NULL)

, _data(x)

{}

};

(1)求二叉树的叶子节点数leafsize:

叶子节点指的是,节点无子女节点。我们有两种思路:

1)设置一下全局变量或者静态变量的size,遍历二叉树,每次遇到一个节点就加加一次size

2)总叶子节点数就等于左子树叶子节点个数+右子树叶子节点个数

//思路1:

size_t _LeafSize(Node* root)

{

static int size = 0;

if (root == NULL)

{

return size;

}

if (root->_left == NULL && root->_right == NULL)

{

size++;

return size;

}

_LeafSize(root->_left);

_LeafSize(root->_right);

}//思路2:

size_t _LeafSize(Node* root)

{

if (root == NULL)

{

return 0;

}

if (root->_left == NULL &&root->_right == NULL)

{

return 1;

}

return _LeafSize(root->_left) + _LeafSize(root->_right);

}

(2)求二叉树的深度depth:

深度也称作为高度,就是左子树和右子树深度的较大值。size_t _Depth(Node* root)

{

if (root == NULL)

{

return 0;

}

int LeftDepth = _Depth(root->_left);

int RightDepth = _Depth(root->_right);

return LeftDepth > RightDepth ? LeftDepth +1: RightDepth+1;

}

(3)求二叉树的节点个数size:

总节点数就等于左子树节点个数+右子树节点个数+根节点个数1size_t _Size(Node* root)

{

if (root == NULL)

{

return 0;

}

return _Size(root->_left) + _Size(root->_right) + 1;

}

(4)求第k层节点数:

默认根节点为第一层1。

思路与求叶子节点类似。size_t _kLevelSize(Node* root, int k)//默认根节点为第1层

{

assert(k > 0);

if (root == NULL)

{

return 0;

}

if (k == 1)

{

return 1;

}

//不可以传参数k--,不然只能是执行完这一句代码后k才会发生变化,k一直为3

//不可以传参数--k,执行root->_left时,k变为2,执行root->_right时为同一层

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值