树 --- 基本操作

  1. 计算树中的节点个数
  2. 查找节点位置
  3. 查找某个节点的父节点
  4. 判断是否是完全二叉树
  5. 判断是否是满二叉树

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;
}


 


 

猜你喜欢

转载自blog.csdn.net/qq_41727218/article/details/86553621