C++创建二叉树(链)

在中国大学MOOC听了武汉大学—李春葆老师的数据结构课,来写个笔记。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
(如有侵权,联系博主,立删。)

括号表示法字符串构造二叉链:
遍历所给的字符串,当一个元素后面紧跟着一个左括号"(",便代表着它有孩子结点,将这个元素入栈,去构造它的左子树和右子树,遇到",",表示右子树的开始,遇到")",表示一棵子树的结束。一个父亲结点的子树构造完成,便将其出栈。直到所给字符串遍历结束。

Code
#include<iostream>
#include<stack>
#include<algorithm>
using namespace std;
struct Node
{
	char data;
	Node* lchild,*rchild;
};
void create_tree(Node*& root,string & str) {//二叉树括号表示串 创建二叉链  利用栈
	root = NULL;
	stack<Node*> S;//用了STL,偷懒
	Node* p;
	int k=0;
	//偷了个小懒,直接用str[i],没写char ch=str[i]
	for (int i = 0; i < str.length(); i++) {
		switch (str[i])
		{
		case '(':S.push(p); k = 1; break;
		case ')':S.pop(); break;
		case ',':k = 2; break;
		default: {
			p = new Node;
			p->data = str[i];
			p->lchild = p->rchild = NULL;
			if (root == NULL) root = p;
			else {
				switch (k)
				{
				case 1:S.top()->lchild = p; break;
				case 2:S.top()->rchild = p; break;
				}
			}
		}
			break;
		}
	}
}
void xian(Node*& root) {//先序遍历二叉树  
	if (root != NULL) {
		cout << root->data;
		xian(root->lchild);
		xian(root->rchild);
	}
}
void zhong(Node*& root) {//中序遍历二叉树
	if (root != NULL) {
		zhong(root->lchild);
		cout << root->data;
		zhong(root->rchild);
	}
}
void hou(Node*& root) {//后序遍历二叉树
	if (root != NULL) {
		hou(root->lchild);
		hou(root->rchild);
		cout << root->data;
	}
}
int main() {
	Node* root;
	string s = "A(B(D(,G)),C(E,F))";
	create_tree(root,s);
	cout << "先序遍历:";
	xian(root);
	cout << endl;
	cout << "中序遍历:";
	zhong(root);
	cout << endl;
	cout << "后序遍历:";
	hou(root);
	cout << endl;
}
Output

在这里插入图片描述

我自己另外还写了个先序输入创建二叉树的

Code
#include<iostream>
#include<stack>
#include<algorithm>
using namespace std;
struct Node
{
	char data;
	Node* lchild,*rchild;
};
void create_tree(Node*& root) {//先序输入建立二叉树 //例:A B D # # E # # C F # # G # #
	char x;
	cin >> x;
	if(x!='#')//判断到达叶子结点
	{
		root = new Node;
		root->data = x;
		create_tree(root->lchild);
		create_tree(root->rchild);
	}
	else root = NULL;
}
void xian(Node*& root) {//先序遍历二叉树  
	if (root != NULL) {
		cout << root->data;
		xian(root->lchild);
		xian(root->rchild);
	}
}
void zhong(Node*& root) {//中序遍历二叉树
	if (root != NULL) {
		zhong(root->lchild);
		cout << root->data;
		zhong(root->rchild);
	}
}
void hou(Node*& root) {//后序遍历二叉树
	if (root != NULL) {
		hou(root->lchild);
		hou(root->rchild);
		cout << root->data;
	}
}
int main() {
	Node* root;
	cout << "先序输入: ";
	create_tree(root);//先序输入建立二叉树
	cout << "先序遍历:";
	xian(root);
	cout << endl;
	cout << "中序遍历:";
	zhong(root);
	cout << endl;
	cout << "后序遍历:";
	hou(root);
	cout << endl;
}
Output

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/buibuilili/article/details/107721988