- 计算树中的节点个数
- 查找节点位置
- 查找某个节点的父节点
- 判断是否是完全二叉树
- 判断是否是满二叉树
1、计算树中的节点个数
思路:计算节点个数和计算树的深度其实本质上的一样的。树的节点个数即为左子树的节点个数加右子树节点个数加1.因此同样可以用递归来做。
代码如下:
int GetSize(Node* tree)
{
if (tree == NULL)
{
return 0;
}
else
{
return GetSize(tree->lTree) + GetSize(tree->rTree) + 1;
}
}
2、查找节点位置
思路:要找的节点如果是当前节点,那么返回该节点就好了,如果不是,那么在其左子树中找,如果还没有找到,在其右子树中找咯,如果还没有,不好意思,该树中不存在这样的节点。按照这个思路我们利用递归去做就好了。
代码如下:
Node* FindNode(Node *tree, ElemType val)
{
if (tree == NULL)
{
return NULL;
}
if (tree->val == val)
{
return tree;
}
else if (FindNode(tree->lTree, val))
{
return FindNode(tree->lTree, val);
}
else
{
return FindNode(tree->rTree, val);
}
}
3、查找某个节点的父节点
原理和查找结点的位置是一样的,直接上代码好了。
Node* GetNodeParent(Node* tree, ElemType val)
{
if (tree == NULL || tree->val == val)
{
return NULL;
}
if ((tree->lTree != NULL && tree->lTree->val == val)
|| (tree->rTree != NULL && tree->rTree->val == val))
{
return tree;
}
else if (GetNodeParent(tree->lTree, val))
{
return GetNodeParent(tree->lTree, val);
}
else
{
return GetNodeParent(tree->rTree, val);
}
}
4、判断是否是完全二叉树
思路:
- 首先,空树是完全二叉树
- 先将根节点入栈
- 获取栈顶元素并出栈
- 如果获取到的栈顶元素不为空,则入栈栈顶元素的左右孩子,循环上述步骤。否则退出循环。
- 退出循环后如果栈中还有非NULL结点,则说明该树不是完全二叉树。
代码如下:
bool isEntireTree(Node* tree)
{
//树为NULL是完全二叉树
if (tree == NULL)
{
return true;
}
queue<Node*> qu;
qu.push(tree);
while (1)
{
tree = qu.front();
qu.pop();
if (tree)
{
qu.push(tree->lTree);
qu.push(tree->rTree);
}
else
{
break;
}
}
while (!qu.empty())
{
tree = qu.front();
qu.pop();
if (tree)
{
return false;
}
}
return true;
}
5、判断树是否是满二叉树
思路:满二叉树的结点树等于,2^树的层数 - 1。
代码如下:
bool isFullTree(Node* tree)
{
if (tree == NULL)
{
return false;
}
int num = Depth(tree);
int size = GetSize(tree);
if (size != (pow(2, num) - 1))
{
return false;
}
return true;
}