要想试着去模拟构建一棵二叉树,就必须了解二叉树在系统中是如何保存的,实际上,二叉树的节点保存在一个数组中,我们以下面二叉树为例:(#为空节点,占一个子节点位置)
满二叉树:每一层节点都是完整的,每层节点数(2^(n-1))
完全二叉树:最后一个节点之前不存在空节点。
满二叉树一定是完全二叉树,完全二叉树不一定是满二叉树。
1,求节点个数:(递归)
思路:root为空时,返回0;root不为空时,左子树节点+右子树节点+1(当前节点)
size_t _Size(Node* root)
{
if(NULL == root)
return 0;
return _Size(root->_left)+_Size(root->_right)+1;
}
2,求叶子节点个数:(递归)
思路:如果root为空时,返回0;如果root的左子树为空且右子树为空时,返回1;
size_t _LeafSize(Node* root)
{
if(NULL == root)
return 0;
if(NULL == root->_left && NULL == root->_right)
return 1;
return _LeafSize(root->_left)+_LeafSize(root->_right);
}
3,求二叉树高度(深度):(递归)
思路:如果root为空,返回0;如果root的左子树且右子树为空,返回1,记录左右子树的高度,判断哪个高就选那个病且加1,(加自身节点)
size_t _Depth(Node* root)
{
if(NULL == root)
return 0;
if(NULL == root->_left && NULL == root->_right)
return 1;
size_t LeftDepth = _Depth(root->_left);
size_t RightDepth = _Depth(root->_right);
return (LeftDepth>RightDepth)?(LeftDepth+1):(RightDepth+1);
}
4,求第K层节点个数:(遍历)
思路:如果root为空,返回0;如果root不为空,k为1时返回1,第K层节点数等于第K-1层的节点的左节点加上右节点。
size_t _GetKLevel(Node* root,size_t k)
{
if(NULL == root)
return 0;
if(1 == k)
return 1;
return _GetKLevel(root->_left,k-1) + _GetKLevel(root->_right,k-1);
}
5,找特定节点位置:(遍历)
思路:先遍历所在节点,然后遍历左子树 ,最后遍历右子树
Node* _Find(Node* root,const T& x)
{
if(NULL == root)
return NULL