1. 程式人生 > >二叉樹映象(遞迴和非遞迴)+ 判斷一棵二叉樹是否是平衡二叉樹+ 判斷一棵樹是否為完全二叉樹

二叉樹映象(遞迴和非遞迴)+ 判斷一棵二叉樹是否是平衡二叉樹+ 判斷一棵樹是否為完全二叉樹

二叉樹映象(遞迴和非遞迴):

// 求二叉樹的映象:非遞迴
	void GetBinaryMirror_Nor()
	{
		if(_pRoot == NULL)
			return;
		stack<Node*> s;
		s.push(_pRoot);
		while(!s.empty())
		{
			Node* pCur = NULL;
			pCur = s.top();
			s.pop();
			if(pCur->_pLeft || pCur->_pRight)
				swap(pCur->_pLeft,pCur->_pRight);
			if(pCur->_pRight)
				s.push(pCur->_pRight);
			if(pCur->_pLeft)
				s.push(pCur->_pLeft);
		}
	}

        // 求二叉樹的映象:遞迴版本
	void GetBinaryMirror()
	{
		_GetBinaryMirror(_pRoot);
	}
        void _GetBinaryMirror(Node* &pRoot)
	{
		if(pRoot == NULL)
			return;
		if(pRoot->_pLeft == NULL && pRoot->_pRight == NULL)
			return;
		swap(pRoot->_pLeft,pRoot->_pRight);
		_GetBinaryMirror(pRoot->_pLeft);
		_GetBinaryMirror(pRoot->_pRight);
	}

判斷一棵二叉樹是否是平衡二叉樹:

bool IsBalanceBinaryTree()
	{
		return _IsBalanceBinaryTree(_pRoot);
	}
bool _IsBalanceBinaryTree(Node* pRoot)
	{
		if(pRoot == NULL)
			return true;
		if(pRoot->_pLeft == NULL && pRoot->_pRight == NULL)
			return true;
		size_t L = _Height(pRoot->_pLeft);
		size_t R = _Height(pRoot->_pRight);
		int b = R-L;
		if(b > 1 || b < -1)
			return false;
		else
			return _IsBalanceBinaryTree(pRoot->_pLeft)&&_IsBalanceBinaryTree(pRoot->_pRight);
	}

 判斷一棵樹是否為完全二叉樹:
// 利用層序遍歷來處理--> 關鍵:找第一個度不為2的結點-->後續結點
	// 如果有孩子則不是完全二叉樹
	// 否則:是
	bool IsCompleteBinaryTree()
	{
		if(_pRoot == NULL)
			return false;
		queue<Node*> q;
		q.push(_pRoot);
		bool flag = false;
		while(!q.empty())
		{
			Node* pCur = NULL;
			pCur = q.front();
			q.pop();
			if(!pCur->_pLeft && pCur->_pRight)   //只有右孩子
				return false;
			else if(pCur->_pLeft && !pCur->_pRight)   //只有左孩子
			{
				if(flag == true)
					return false;
				flag = true;
			}
			else if(!pCur->_pLeft && !pCur->_pRight)    //沒有孩子
			{
				flag = true;
			}
			else
			{
				if(flag == true)
					return false;
			}
			if(pCur->_pLeft)
				q.push(pCur->_pLeft);
			if(pCur->_pRight)
				q.push(pCur->_pRight);
		}
		return true;
	}