二叉树的基本实现和遍历——递归

                                        二叉树

//创建结构体
template<class T>
struct BinaryTreeNode
{
	T _data;
	BinaryTreeNode<T>* _left;
	BinaryTreeNode<T>* _right;

	BinaryTreeNode(const T& x)
		:_data(x)
		, _left(NULL)
		, _right(NULL)
	{}
};

//构造函数,拷贝构造函数
template <class T>
class BinaryTree
{
	typedef BinaryTreeNode<T> Node;
public:
	BinaryTree()
		:_root(NULL)
	{}

	BinaryTree(T* a, size_t n, const T& invalid)//构造函数
	{
		size_t index = 0;
		_root = _CreateTree(a, n, invalid, index);
	}

	Node* _CreateTree(T* a, size_t n, const T& invalid, size_t& index)
	{
		Node* root = NULL;
		if (index < n && a[index] != invalid)
		{
			root = new Node(a[index]);
			root->_left = _CreateTree(a, n, invalid, ++index);
			root->_right = _CreateTree(a, n, invalid, ++index);
		}
		return root;
	}

		BinaryTree(const BinaryTree& t)//拷贝函数
		{
			_root = _BinaryTree(t._root);
		}
	
		Node* _BinaryTree(Node* root)
		{
			Node* newroot = NULL;
			if (root)
			{
				//拷贝根节点
				newroot = new Node(root->_data);
				//拷贝左子树
				newroot->_left = _BinaryTree(root->_left);
				//拷贝右子树
				newroot->_right = _BinaryTree(root->_right);
			}
			return newroot;
		}
	
		~BinaryTree()//析构函数
		{
			_DestroyBinaryTree(_root);
		}
		void _DestroyBinaryTree(Node* &root)
		{
			if (root)
			{
			_DestroyBinaryTree(root->_left);
			_DestroyBinaryTree(root->_right);
			delete root;
			root = NULL;
			}
		}


//递归实现四种遍历
	void PrevOrder()//前序遍历
	{
		cout << "PrevOrder" << endl;
		_PrevOrder(_root);
		cout << endl;
	}
	void _PrevOrder(Node* root)
	{
		if (root == NULL)
		{
			return;
		}
		cout << root->_data << " ";
		_PrevOrder(root->_left);
		_PrevOrder(root->_right);
	}

	void InOrder()//中序遍历
	{
		cout << "InOrder" << endl;
		_InOrder(_root);
		cout << endl;
	}
	void _InOrder(Node* root)
	{
		if (root == NULL)
		{
			return;
		}
		_InOrder(root->_left);
		cout << root->_data << " ";
		_InOrder(root->_right);
	}

	void PostOrder()//后序遍历
	{
		cout << "PostOrder" << endl;
		_PostOrder(_root);
		cout << endl;
	}
	void _PostOrder(Node* root)
	{
		if (root == NULL)
		{
			return;
		}
		_PostOrder(root->_left);
		_PostOrder(root->_right);
		cout << root->_data << " ";
	}

	void LevelOrder()//层序遍历
	{
		if (_root == NULL)
		{
			return;
		}
		queue<Node*> q;
		q.push(_root);
		cout << "LevelOrder" << endl;
		while (!q.empty())//如果队列不为空
		{
			Node* cur = q.front();//取队头元素
			//取左、右子树
			if (cur->_left)
				q.push(cur->_left);
			if (cur->_right)
				q.push(cur->_right);
			//访问队头
			cout << cur->_data << " ";
			q.pop();
		}
		cout << endl;
	}
	
//查询结点个数和深度
	size_t Size()//结点个数
	{ 
		return _Size(_root);
	}
	size_t _Size(Node* root)
	{
		if (root == NULL)
		{
			return 0;
		}
		return _Size(root->_left) + _Size(root->_right) + 1;
	}

	size_t LeafSize()//叶子结点个数
	{
		return _LeafSize(_root);
	}
	size_t _LeafSize(Node* root)
	{
		if (root == NULL)
		{
			return 0;
		}
		//二叉树不为空,左子树右子树为空
		else if (root->_left == NULL && root->_right == NULL)
		{
			return 1;
		}
		//二叉树不为空,且左右子树不同时为空,返回左子树中叶子节点个数加上右子树中叶子节点个数
		return _LeafSize(root->_left) + _LeafSize(root->_right);
	}

	size_t GetKLevel(size_t k)//第k层的结点数
	{
		return _GetKLevel(_root, k);
	}
	size_t _GetKLevel(Node* root, size_t k)
	{
		if (root == NULL || k < 1)
			return 0;
		if (k == 1)
			return 1;
		return _GetKLevel(root->_left, k - 1) + _GetKLevel(root->_right, k - 1);
	}
	size_t Depth()
	{
		return _Depth(_root);
	}
	size_t _Depth(Node* root)//求二叉树深度
	{
		int hl = 0;
		int hr = 0;
		int max = 0;
		if (root == NULL)
		{
			return 0;
		}
		else
		{
			hl = _Depth(root->_left);
			hr = _Depth(root->_right);
			max = hl > hr ? hl : hr;
			return max+1;
		}
	}
//查找、赋值

	Node* Find(const T& x)//查找二叉树结点
	{
		Node* cur = NULL;
		cur = _Find(_root, x);
		cout << _root->_data << " ";
		return cur;
	}
	Node* _Find(Node* root, const T& x)
	{
		if (root == NULL)
			return NULL;
		if (root->_data == x)
			return root;
		Node* left = _Find(root->_left, x);
		if (left)
			return left;
		Node* right = _Find(root->_right, x);
		if (right)
			return right;
		return NULL;
	}

	
BinaryTree& operator=(const BinaryTree& t)
		{
	        	if (*this != &t)
			{
				_DestroyBinaryTree(_root);
				_root = _BinaryTree(t._root);
			}
			return *this;
		}
protected:Node* _root;};


//测试代码
void TestBinaryTree()
{
        int array[] = { 1, 2, 3, '#', '#', 4, '#', '#', 5, 6, '#', '#' };
	BinaryTree<int> t(array, sizeof(array) / sizeof(array[0]), '#');
	t.PrevOrder();
	t.InOrder();
        t.PostOrder();
	t.LevelOrder();
	//cout << "Find?" << t.Find(4) << endl;


	/*BinaryTree<int> t1(t);
        t1.PrevOrder();
        t1.PostOrder();

        BinaryTree<int> t2 = t;
	t2.PrevOrder();*/

	//t.LeafSize();
	//cout << "Size?" << t.Size() << endl;
	//cout << "LeafSize?" << t.LeafSize() << endl;

	//cout << "GetKLevel?" << t.GetKLevel(3) << endl;
        //cout << "Depth?" << t.Depth() << endl;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值