C++实现二叉树

Posted Wecccccccc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++实现二叉树相关的知识,希望对你有一定的参考价值。

代码如下:

#include<iostream>
#include <queue>
#include <stack>
using namespace std;

class BinTree

private:
	class TreeNode
	
	public:
		int data;
		TreeNode *left;
		TreeNode *right;

		TreeNode ():data(0),left(nullptr),right(nullptr)
		TreeNode(int e):data(e),left(nullptr),right(nullptr)

	;

private:
	TreeNode *root;

public:
	BinTree():root(nullptr)

	void pre_in_buildTree(int *pre, int *in, int n)
	
		if (n <= 0)
		
			cout << "The tree is null" << endl;
			return;
		

		root = pre_in_dfsTree(pre, in, 0, n - 1, 0, n - 1);
	


	void in_post_buildTree(int *in, int *post, int n)
	
		if (n <= 0)
		
			cout << "The tree is null" << endl;
			return;
		

		root = in_post_dfsTree(in, post, 0, n - 1, 0, n - 1);
	

	void preOrder()
	
		predfsTree(root);
		cout << endl;
	

	void inOrder()
	
		indfsTree(root);
		cout << endl;
	

	void postOrder()
	
		postdfsTree(root);
		cout << endl;
	

	void levelOrder()//层次遍历
	
		if (root == nullptr)
		
			cout << "The tree is null" << endl;
			return;
		
		queue<TreeNode *> q;
		q.push(root);
		while (!q.empty())
		
			TreeNode *t = q.front();
			cout << t->data << " ";
			q.pop();
			if (t->left) q.push(t->left);
			if (t->right) q.push(t->right);
		
		cout << endl;
	


	void preOrder_Stack()//先序遍历(非递归)
	
		TreeNode *p = root;
		stack<TreeNode *> s;
		while (p || !s.empty())
		
			while (p)
			
				cout << p->data << " ";
				s.push(p);
				p = p->left;
			
			if (!s.empty())
			
				p = s.top();
				s.pop();
				p = p->right;
			
		
		cout << endl;
	


	void inOrder_Stack()//中序遍历(非递归)
	
		TreeNode *p = root;
		stack<TreeNode *> s;
		while (p || !s.empty())
		
			while (p)
			
				s.push(p);
				p = p->left;
			
			if (!s.empty())
			
				p = s.top();
				cout << p->data << " ";
				s.pop();
				p = p->right;
			
		
		cout << endl;
	

	void postOrder_Stack()//后序遍历(非递归)
	
		stack<TreeNode *>s;
		s.push(root);
		while (!s.empty())
		
			TreeNode *t = s.top();
			s.pop();
			if (t)
			
				s.push(t);
				s.push(nullptr);
				if (t->right) s.push(t->right);
				if (t->left) s.push(t->left);
			
			else
			
				t = s.top();
				s.pop();
				cout << t->data << " ";
			
		
		cout << endl;
	

private:

	TreeNode* pre_in_dfsTree(int *pre, int *in, int o1, int h1, int o2, int h2)//传入先序遍历和中序遍历构造一颗树
	
		if (o1 > h1) return nullptr;
		int val = pre[o1];
		TreeNode *root = new TreeNode(val);
		if (o1 == h1) return root;
		int mid = 0;
		while (in[o2 + mid] != val) mid++;
		root->left = pre_in_dfsTree(pre, in,o1+1 ,o1+mid ,o2,o2+mid-1 );
		root->right = pre_in_dfsTree(pre, in,o1+mid+1 ,h1 , o2 + mid + 1, h2);

		return root;
	


	TreeNode * in_post_dfsTree(int *in, int *post, int o1, int h1, int o2, int h2)//传入中序遍历和后序遍历构造一颗树
	
		if (o1 > h1) return nullptr;
		int val = post[h2];
		TreeNode *root = new TreeNode(val);
		if (o1 == h1) return root;
		int mid = 0;
		while (in[o1 + mid] != val) mid++;
		root->left = in_post_dfsTree(in, post, o1, o1+mid-1, o2, o2+mid-1);
		root->right = in_post_dfsTree(in, post,o1+mid+1 ,h1, o2 + mid, h2-1);

		return root;
	


	void predfsTree(TreeNode *root)//先序遍历
	
		if (root == nullptr) return;
		cout << root->data << " ";
		predfsTree(root->left);
		predfsTree(root->right);
	


	void indfsTree(TreeNode *root)//中序遍历
	
		if (root == nullptr) return;
		indfsTree(root->left);
		cout << root->data << " ";
		indfsTree(root->right);
	


	void postdfsTree(TreeNode *root)//后序遍历
	
		if (root == nullptr) return;
		postdfsTree(root->left);
		postdfsTree(root->right);
		cout << root->data << " ";
	

	
;

int main()

	BinTree t1;
	int pre[] =  3,9,20,15,7 ;
	int in[] =  9,3,15,20,7 ;
	int post[] =  9,15,7,20,3 ;
	t1.pre_in_buildTree(pre, in,5);
	BinTree t2;
	t2.in_post_buildTree(in, post, 5);
	t1.levelOrder();
	t2.levelOrder();
	t1.preOrder();
	t2.preOrder();
	t1.preOrder_Stack();
	t1.inOrder();
	t2.inOrder();
	t1.inOrder_Stack();
	t1.postOrder();
	t2.postOrder();
	t1.postOrder_Stack();
	
	return 0;

测试结果如下:

以上是关于C++实现二叉树的主要内容,如果未能解决你的问题,请参考以下文章

C++ 实现平衡二叉树(AVL树)(完整代码)

怎么判断是不是是完全二叉树 用C++或C语言

C++ class实现二叉树(完整代码,附非递归遍历)

LeetCode题目记录-654. 最大二叉树(C++代码实现)

c++实现搜索二叉树

C++实现二叉树