二叉树的几道典型例题

1.求二叉树的高度

int _GetTreeHight(Node* pRoot)
	{
		if(pRoot==NULL)
			return 0;

		if(pRoot->_pLeft==NULL&&pRoot->_pRight==NULL)
			return 1;

		int left=_GetTreeHight(pRoot->_pLeft)+1;
		int right=_GetTreeHight(pRoot->_pRight)+1;

		return left>right?left:right;
	}
2.求叶子结点的个数

	int _LeafNodeNum(Node* pRoot)
	{
		if(pRoot==NULL)
			return 0;

		if(pRoot->_pLeft==NULL&&pRoot->_pRight==NULL)
			return 1;

		int left=_LeafNodeNum(pRoot->_pLeft);
		int right=_LeafNodeNum(pRoot->_pRight);

		return left+right;
	}
3.判断一个数据是否在一棵二叉树中

Node* _Find(Node* pRoot,const T& data)
	{
		if(pRoot==NULL)
			return NULL;

		if(pRoot->_value==data)
			return pRoot;

		Node* pcur=_Find(pRoot->_pLeft,data);
		if(pcur)
			return pcur;

		return _Find(pRoot->_pRight,data);
	}

4.求二叉树中两个结点的最近公共祖先结点

	bool GetWay(Node* pRoot,Node* N,vector*>& v,size_t index)
	{
		if(pRoot==NULL)
			return false;

		v.push_back(pRoot);
		if(pRoot==N)
			return true;

		pRoot=v.back();
		if(GetWay(pRoot->_pLeft,N,v,index+1))
			return true;

		v.pop_back();
		pRoot=v.back();
		return GetWay(pRoot->_pRight,N,v,index+1);
	}

	Node* _LastAncestorNode(Node* pRoot,Node* N1,Node* N2)
	{
		if(pRoot==NULL||(pRoot->_pLeft==NULL&&pRoot->_pRight==NULL))
			return NULL;

		vector*> v1;
		vector*> v2;
		if(GetWay(pRoot,N1,v1,0)&&GetWay(pRoot,N2,v2,0))
		{
			for(size_t i=v1.size();i>0;--i)
			{
				for(size_t j=v2.size();j>0;--j)
				{
					if(v1[i-1]==v2[j-1])
						return v1[i-1];
				}
			}
		}
		
		return NULL;
	}
5.查找一个节点的双亲节点

	Node* _FindParent(Node* pRoot,Node* pRet)
	{
		if(pRoot==NULL||pRet==pRoot)
			return NULL;

		if(pRoot->_pLeft==pRet||pRoot->_pRight==pRet)
		{
			return pRoot;
		}
		
		Node* pcur=_FindParent(pRoot->_pLeft,pRet);
		if(pcur)
			return pcur;

		return _FindParent(pRoot->_pRight,pRet);

	}

6.求二叉树中最远的两个结点之间的距离

	int _DistanceOfNodes(Node* pRoot)
	{
		if(pRoot==NULL)
			return 0;

		int left=_GetTreeHight(pRoot->_pLeft);
		int right=_GetTreeHight(pRoot->_pRight);

		return left+right;
	}

7.判断一棵二叉树是否是完全二叉树

	bool _IsCompleteBinaryTree(Node* pRoot)
	{
		if(pRoot==NULL)
			return false;

		queue*> q;
		q.push(pRoot);

		while((pRoot=q.front())!=NULL)
		{
			q.push(pRoot->_pLeft);
			q.push(pRoot->_pRight);
			q.pop();
		}

		while(!q.empty()&&(pRoot=q.front())==NULL)
		{
			q.pop();	
		}

		if(!q.empty())
			return false;

		return true;

	}

8.求二叉树的镜像

	BinaryTree ImageBinaryTree()
	{
		BinaryTree bt;
		bt._pRoot=CopyTree(_pRoot);
		_ImageBinaryTree(bt._pRoot);
		return bt;
	}
	
        void _ImageBinaryTree(Node* pRoot)
	{
		Node* pcur=pRoot;

		if(pcur==NULL||(pcur->_pLeft==NULL&&pcur->_pRight==NULL))
			return ;

		swap(pcur->_pLeft,pcur->_pRight);

		_ImageBinaryTree(pcur->_pLeft);
		_ImageBinaryTree(pcur->_pRight);
	}





你可能感兴趣的:(典型习题)