二叉树学习——简单入门题

Posted blfbuaa

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树学习——简单入门题相关的知识,希望对你有一定的参考价值。

入门题一:

    输入一颗二叉树。你的任务是按从上到下、从左到右的顺序输出各个节点的值。每一个节点都依照从根节点到它的移动序列给出
(L表示左,R表示右)。在输入中,每一个节点的左括号和右括号之间没有空格,相邻节点之间用一个空格隔开。

每颗树的输入用一
对空括号()结束(这对空括号不代表节点)
    注意,假设从根到某个叶节点的路径上有的节点没有在输入中给出,或者给出了超出一次,应到输出 -1 。节点个数不超过256。

例子输入:
    (11,LL) (7,LLL) (8,R) (5,) (4,L) (13,RL) (2,LLR) (1,RRR) (4,RR) ()
    (3,L) (4,R) ()
例子输出:
    5 4 8 11 13 4 7 2 1
    0

#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#define maxn 256

char buf[maxn];	//保存读入节点
int failed;
int n=0,ans[maxn];	//节点个数和输出序列 

typedef struct Tnode{
	int have_value;	//是有赋过值 
	int v;			//节点值 
	struct Tnode *left,*right;
}Node;
Node *root;	//二叉树的根节点 

Node* newnode()
{
	Node *tmp=(Node*)malloc(sizeof(Node));
	if(tmp!=NULL)
	{
		tmp->have_value=0;		//显示的初始化为0,由于malloc申请内存时并不把它清零
		tmp->left=tmp->right=NULL; 
	}
	return tmp;	
}

void addnode(int value,char *s)
{
	int length=strlen(s);
	Node *tmp=root;
	for(int i=0;i<length;i++){	//索引相应的位置 
		if(‘L‘==s[i])
		{
			if(NULL==tmp->left) tmp->left=newnode();
			tmp=tmp->left;
		}else if(‘R‘==s[i]){
			if(NULL==tmp->right) tmp->right=newnode();
			tmp=tmp->right;
		}		
	}
	if(tmp->have_value) failed=1;	//已经赋过值表明输入有误 
	tmp->v=value;	tmp->have_value=1;
}

int read_input()
{
	failed=0;
	root=newnode();
	for(;;)
	{
		if(scanf("%s",buf)!=1) return 0;	//整个输入结束
		if(!strcmp(buf,"()")) break;
		int v;
		sscanf(&buf[1],"%d",&v);	//读入节点的值
		addnode(v,strchr(buf,‘,‘)+1); 
	}
	return 1;
} 

/*  BFS,Breadth-Firsh Search  宽度优先遍历 */ 
int bfs()
{
	int front=0,rear=1;
	Node* q[maxn];
	q[0]=root;
	while(front<rear)
	{
		Node* tmp=q[front++];
		if(tmp->have_value==0) return 0;
		
		ans[n++]=tmp->v;
		if(NULL != tmp->left)  q[rear++]=tmp->left;
		if(NULL != tmp->right) q[rear++]=tmp->right;
	}
	return 1;
}

void remove_tree(Node* u)
{
	if(NULL==u) return ;
	remove_tree(u->left);
	remove_tree(u->right);
	free(u);
}
 
int main()
{
	read_input();
	
	if(bfs() && !failed){
		for(int i=0;i<n;i++){
			printf("%d ",ans[i]);
		}
	}else{
		printf("0\n");
	}
	return 0;
} 


入门题二:

输入一颗二叉树的先序遍历和中序遍历,输出它的后序遍历序列。
例子输入:
        DBACEGF ABCDEFG
        BCAD CBAD
例子输出:
        ACBFGED
        CDAB 

#include "stdio.h"
#include "string.h"
#define maxn 20
char preorder[maxn],inorder[maxn],postOrder[maxn]; 		//先序、中序 和后序 


//n树的节点个数,pre前序,in中序,post后序 
void build(int n,char *pre,char *in,char *post)
{
	if(n<=0) return;
	int x=strchr(in,pre[0])-in;		//找到根节点在中序遍历中的位置 
	build(x,pre+1,in,post);			//递归构造左子树的后序遍历 
	build(n-x-1,pre+x+1,in+x+1,post+x);		//递归构造右子树的后序遍历 
	post[n-1]=pre[0];	//根节点加入到最后 
}

int main()
{
	while(scanf("%s%s",preorder,inorder)==2)
	{
		int n=strlen(preorder);
		build(n,preorder,inorder,postOrder); 
		postOrder[n]=‘\0‘;
		printf("%s\n",postOrder);		
	} 
	return 0;
} 



以上是关于二叉树学习——简单入门题的主要内容,如果未能解决你的问题,请参考以下文章

⭐算法入门⭐《二叉树》简单04 —— LeetCode 104. 二叉树的最大深度

⭐算法入门⭐《二叉树》简单01 —— LeetCode 965. 单值二叉树

⭐算法入门⭐《二叉树 - 平衡二叉树》简单01 —— LeetCode 110. 平衡二叉树

⭐算法入门⭐《二叉树》简单09 —— LeetCode 144. 二叉树的前序遍历

⭐算法入门⭐《二叉树》简单05 —— LeetCode 111. 二叉树的最小深度

⭐算法入门⭐《二叉树》简单07 —— LeetCode 993. 二叉树的堂兄弟节点