二叉树:树的每个节点最多有两个子节点。
我们看下它的结构,有二叉链表结构与三叉链表结构,具体结果如我摘自《C++Primer》中的图。
相比之下,三叉链表的优势在于当我们知道父亲节点要找他的子女节点比较方便和便捷,反之当我们知道子女节点找它的父亲节点时也方便。
下面,我实现下二叉链表的结构。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时为同一层