入门选手建立二叉树

//建立一个二叉树  才能去吃饭
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
const int MAXN=50; 
using namespace std; 
class node{
	private :
		char  data; 
		node* lchild;
		node* rchild; 
		static int m; 
	public :
		void createnode(node * &,char *);
}; 

void node::createnode(node *&b,char *a){//注意这里对函数命名空间的声明 
	int top=-1,k,j=0;
	char ch; 
	ch=a[j]; 
	node *s[MAXN],*p; 
	while(ch!='\0'){
		switch(ch){ 
			case '(':
				top++;
				k=1;
				s[top]=p;	
				break; 
			case ')':
				top--; 
				break; 
			case ',':
				k=2; 
				break; 
			default : 
			if(b==NULL){
			b=p; 
			} else{ 
			p=new node; //注意这里对p创建对象的操作; 
				p->data=ch;
				p->lchild=NULL;
				p->rchild=NULL; 
				switch (k){ 
					case 1:
						s[top]->lchild=p;
						break;
					case 2:
						s[top]->rchild=p; 
						} 
				}
			} 
			j++;
			ch=a[j];	
	}
}

int main()
{
	node *b;
	char a[]="A(B(D,E(H(J,K(L,M(,N))),)),C(F,G(,I)))" ; 
	b->createnode(b,a); 
	
} 


 

废话不多说,直接撸码,注释清晰,初学者务必手写一遍注释

 

 

下边是不放心自己能不能学会而自己动手的,初学者注意:大部分教材对二叉树有详细的解释,可是大部分人却看不懂,所以,这是一个只能意会不能言传的东西,多看代码,摸索精髓,over!

#include<iostream>
#include<queue>
#define maxsize 50
using namespace std;
class node{
private:
	char data;
	node* lchild;
	node* rchild;
	static int i;
	static int m;
	public:
	void createnode(node *&,char *);
}; 
int node::i=0;
int node::m=0;
/*懵逼之建立二叉树:
	首先:要考虑初值条件,比如使top为-1使b为NULL 
	其次:判断读入字符的处理方式:{
		读入(使top(层深)+1,并且是s【top】指向上次建立的p,使k=1; 
		读入)使top减一 ,
		读入,使k=2 ,
		读入字符,建立一个新的元素对象,并使该对象的左右孩子的指为NULL 
					并且判断k,如果k为1,则s【top】左孩子为该新元素,否则右孩子是 
	}
*/ 
void node::createnode(node* &b,char* a){
	node *st[maxsize],*p;//建立两个二叉树类型的指针, 
	int top=-1,k,j=0;//赋初值,top为-1,这样才能在数组中从0开始 
	char ch;		//从数组中读取字符 
	b=NULL;			//使b指向NULL 
	ch=a[j];	
	while(ch!='\0')
	{								
		switch(ch)
		{
			
		case '(':	// 层数加一 
			top++;
			st[top]=p;//上一次循环开辟的p为这一层的parent 
			k=1;
			break;
		case ')':	//层数减一 
			top--;
			break;
		case ',':	//左孩子,变为右孩子,k是一个标记,k改变 
			k=2;
			break;
		default:
			p=new node;		//倘若遇到字符:为p开辟一个新对象 
			p->data=ch;		//为p的data赋值为该字符 
			m++;			//元素数量+1 
			p->lchild=p->rchild=NULL;//在建立该节点的时候,使其左右节点均为NULL 
			if(b==NULL){	//判断是不是根节点,如果是,为b赋值 
				b=p;
			}
			else{
				switch(k)	//判断新输入的值是左孩子还是右孩子	 
				{
				case 1:		//左孩子的话使新开辟的节点被上层左孩子指针指 
					st[top]->lchild=p;
					break;
				case 2:			//右孩子的话使新开辟的节点被上层右孩子指针指 
					st[top]->rchild=p;
					break;
				}
			}
		}
		j++;
		ch=a[j];
	}
}
 
 void main()
{
	node *b;
	char a[]="A(B(D,E(H(J,K(L,M(,N))),)),C(F,G(,I)))";
	b->createnode(b,a);
	//A(B(D,E(H(J,K(L,M(,N))),)),C(F,G(,I)))  样本输入
} 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您讲解递归建立二叉树的方法。首先,我们需要定义二叉树的数据结构,包含一个根节点和左右子树。然后,我们可以通过递归的方式建立二叉树。 具体的方法是,我们首先读入根节点的值,然后判断左子树和右子树是否为空。如果不为空,我们就递归调用建立左右子树的操作。递归建立左子树的过程是将读入的下一个值作为左子树的根节点值,然后递归调用建立左子树的操作。递归建立右子树也是类似的过程。 下面是一个示例代码,用于递归建立二叉树: ```c++ #include <iostream> using namespace std; struct TreeNode { int val; TreeNode* left; TreeNode* right; TreeNode(int x) : val(x), left(NULL), right(NULL) {} }; TreeNode* buildTree() { int val; cin >> val; if (val == -1) { return NULL; } TreeNode* root = new TreeNode(val); root->left = buildTree(); root->right = buildTree(); return root; } int main() { TreeNode* root = buildTree(); return 0; } ``` 在这个示例代码中,我们定义了一个TreeNode结构体,包含一个值val和左右子树指针left和right。然后我们定义了一个buildTree函数,用于递归建立二叉树。在这个函数中,我们首先读入根节点的值,如果值为-1,说明这个节点为空,返回NULL。否则,我们创建一个根节点,然后递归调用建立左右子树的操作。最后返回根节点。 这样,我们就可以通过递归的方式建立二叉树了。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值