1. 程式人生 > >【C++】滿二叉樹與完全二叉樹的區別及判斷

【C++】滿二叉樹與完全二叉樹的區別及判斷

#include<iostream>
#include<queue>
using namespace std;
struct BinaryTreeNode
{
	char _data;
	BinaryTreeNode*_left;
	BinaryTreeNode*_right;
	BinaryTreeNode(const char &data)
		:_data(data)
		, _left(NULL)
		, _right(NULL)
	{}
};

class BinaryTree
{
public:
	BinaryTree(const char *str)
	{
		_CreatBinaryTree(_root, str);//遞迴建立二叉樹  
	}
	int Size() //求二叉樹的節點個數
	{
		return _Size(_root);
	}
	int Depth()//求二叉樹的深度
	{
		return _Depth(_root);
	}
	
	void FullResult()//二叉樹判滿的輸出結果
	{
		if (FullBinaryTree())
		{
			cout << "該二叉樹是滿二叉樹" << endl;
		}
		else
		{
			cout << "該二叉樹不是滿二叉樹" << endl;
		}
	}
	
	void CompletelyResult()//二叉樹是否為完全二叉樹的輸出結果
	{
		if (CompletelyBinaryTree())
		{
			cout << "該二叉樹是完全二叉樹" << endl;
		}
		else
		{
			cout << "該二叉樹不是完全二叉樹" << endl;
		}
	}
protected:
	//遞迴建立二叉樹  
	void _CreatBinaryTree(BinaryTreeNode*&root, const char *&str)
	{
		if (*str != '#'&&*str != '\0')
		{
			root = new BinaryTreeNode(*str);
			_CreatBinaryTree(root->_left, ++str);
			if (*str != '\0')
			{
				_CreatBinaryTree(root->_right, ++str);
			}
		}
	}
	int _Size(BinaryTreeNode*root)
	{
		if (root == NULL)
		{
			return 0;
		}
		else
		{
			return 1 + _Size(root->_left) + _Size(root->_right);
		}
	}
	int _Depth(BinaryTreeNode*root)
	{
		if (root == NULL)
		{
			return 0;
		}
		else
		{
			return 1 + (_Depth(root->_left) > _Depth(root->_right) ? _Depth(root->_left):_Depth(root->_right));
		}
	}
	bool FullBinaryTree()//判斷該二叉樹是否是滿二叉樹
	{
		if (pow(2, Depth()) - 1 == Size())
		{
			return true;
		}
		return false;
	}
	bool CompletelyBinaryTree()//判斷該二叉樹是否是完全二叉樹
	{
		int flag = false;
		queue<BinaryTreeNode *>q;
		if (_root)
		{
			q.push(_root);
		}
		while (!q.empty())
		{
			BinaryTreeNode* front = q.front();
			q.pop();
			if (front)
			{
				if (flag)
				{
					return false;
				}
				q.push(front->_left);
				q.push(front->_right);
			}
			else
			{
				flag = true;
			}
		}
		return true;
	}
private:
	BinaryTreeNode*_root;
};