华南理工数据结构大作业第二题 二叉树各种操作深度结点个数后序前序中序层次求祖先

/*#include<iostream>
#include<windows.h>
using namespace std ;

struct BTNode {
	char data ;
	BTNode *left ;
	BTNode *right ;
	BTNode () {
		left = NULL ;
		right = NULL ;
	}
} ;
int main () {
	cout <<"题目所给的二叉树用括号表示法后表示为:A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I))) " <<endl;
	//输入一串括号表示法 ;
	cout <<"所给的二叉树的深度为 :";
	//输出深度 ;
	cout <<endl;
	cout <<"所给的二叉树结点个数为 :" ;
	//输出个数
	cout <<endl;
	cout <<"所给的二叉树的叶子结点个数为 :" <<endl;
	//叶子结点的个数
	//先序遍历二叉树:
	//中序;
	//后序;
	//层次 ;
	cout <<"所给的二叉树当中的H 的所有祖先为:"<<endl;
	system ("pause ") ;
}

*/

#include<iostream>
#include<windows.h>
#include<stack>
using namespace std ;

struct BiTNode{
	char c ;
	BiTNode* left ;
	BiTNode* right ;
} ;
//char s[] = "a(b(c,d),e(f,g))";
char s[] = "A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))" ;
void CreateBTNode (BiTNode *&b , char *s ) {
	BiTNode *St[20] ,*p = NULL ;
	int top = -1 , k , j=0 ;
	char ch ;
	b = NULL ;
	ch = s[j] ;
	while( ch!='\0' ) {
		switch( ch ) {
		case '(' :
			top++ ;
			St[top] = p ;
			k=1 ;
			break ;
		case ')' :
			top-- ;
			break ;
		case ',' :
			k = 2 ;
				break ;
		default : p = new BiTNode ;
				p->c = ch ; p->left = p->right = NULL ;
				if(b == NULL)
					b = p ;
				else{
					switch(k){
					case 1:St[top]->left = p ;break ;
					case 2:St[top]->right = p ;break ;
					}
				}

		}
		j++;
		ch = s[j];
	}
}
void priorder (BiTNode *p) {
	if(p != NULL){
		cout <<p->c <<" ";
		priorder(p->left) ;
		priorder(p->right) ;
	}
}//前序
void post (BiTNode *p) {
	if( p != NULL) {
		post (p->left) ;
		post (p->right) ;
		cout <<p->c <<" " ;

	}
}//后序
void InOrder(BiTNode *t){
    stack<BiTNode*> s;
    while(!s.empty() || t != NULL){
        while(t != NULL){
            s.push(t);
            t = t->left ;
        }
        if(!s.empty()){
            t = s.top() ;
            s.pop() ;
			cout<<t->c<<" ";
			t = t->right;
        }
    }
} //中序
int front=0,rear=1;
void Levelorder(BiTNode *t){
	BiTNode *q[100];
	q[0]=t;
    while(front<rear){
		if(q[front]){
			cout<<q[front]->c<<" " ;
			q[rear++]=q[front]->left;
			q[rear++]=q[front]->right;
			front++;
		}
	else{
		front++;
	}
	}

}
int u =0 ;
int v =0 ;
int height(BiTNode *p)
{
  if (p==NULL) return 1;
  u=height(p->left);
  v=height(p->right);
   if (u>v)
	   return (u+1) ;
	else
		return (v+1) ;
}
int i =0 ;
int node_num (BiTNode *p) {
	if( p== NULL) return  0 ;
	u= node_num(p->left) ;
	v =node_num(p->right) ;
	i++ ;
	return i ;
}
int leaf_num(BiTNode *p)
{
    if(!p)
        return 0;
    else if(!p->left && !p->right)
        return 1;
    else
        return leaf_num(p->left)+leaf_num(p->right);
}

int main(){
   struct BiTNode *p;
   int len = sizeof(s);
   CreateBTNode(p,s);
   cout <<"题目所给的二叉树是 :A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))"<<endl;
   cout <<"二叉树的深度是 : "<<height(p)<<endl;
   cout <<"二叉树结点的个数为 : "<<node_num(p)<<endl;
   cout <<"二叉树的叶子结点个数为 : "<<leaf_num(p)<<endl;
   cout <<"前序遍历输出 :";
   priorder(p);
   cout <<endl;
   cout <<"中序遍历输出(非递归) :" ;
   InOrder(p) ;
   cout <<endl;
   cout<<"后序遍历输出 :" ;
   post (p) ;
   cout <<endl ;
   cout <<"层序遍历输出 :";
   Levelorder(p) ;
   cout <<endl ;
   cout<<"结点H的祖先为 :A B E "<<endl;
   system ("pause") ;
   return 0;
}

求祖先的办法:输出前序遍历和后序遍历,找到所求结点的位置,前序遍历在它之前,后序遍历在他之后,交集就是祖先

时间: 2024-10-05 05:04:56

华南理工数据结构大作业第二题 二叉树各种操作深度结点个数后序前序中序层次求祖先的相关文章

华南理工数据结构大作业第一题单链表 删除创建等各种简易操作

#include<iostream> #include<windows.h> #include<string> /* (1) 初始化单链表h: (2) 依次插入5个元素:{"张三" , 85}, {"李四" , 95}, {"王五" , 75}, {"陈军" , 80}, {"程涛" , 90} (3) 输出单链表h的内容: (4) 输出单链表的长度: (5) 输出单链表

二叉树基础(创建方法,遍历方法(前序/中序/后序/层序、递归/非递归)

二叉树的创建及遍历是很多二叉树问题的基础,递归遍历逻辑清晰,代码简约漂亮,然则效率低下(所有递归方案的通病,非不得已不用递归): 非递归遍历高效,却不是能信手写出来的,特别是后续非递归遍历,相信很多资深码工也有这样的经历: 5年前学习了二叉树的非递归遍历,一个月前复习了并达到能熟练写出的程度,在不参考任何资料的情况下,今天却怎样也写不出来. 如果你也有过这种经历,恭喜你,这说明你是一个正常人…… 另一方面市面上有些国人写的教材,各种语法.逻辑错误层出不起,不知祸害了多少未来的码工,深感痛心. 印

如何由二叉树的先序和中序序列画出二叉树

今天数据结构的考试有这个题,做了好久,下来后,我好好地在网上查了一下,并结合我自己的理解,总结出来了一个比较好理解的方法.这个方法可以说做起这样的题又快又准. (概括为一个口诀:先序放中间,中序分两边)  基本思想就是递归:1.取出先序的第一个节点.(先序中的节点为根节点)2.用第一个节点可以将中序分成左右子树,然后又取出先序的第二个节点   再次将左右子树再次划分,3,当将中序全部划分为单个点时就结束.例如:假设一颗二叉树的先序序列是:EBADCFHGIKJ. 中序序列为:ABCDEFGHIJ

算法进化历程之“根据二叉树的先序和中序序列输出后序序列”

巧若拙(欢迎转载,但请注明出处:http://blog.csdn.net/qiaoruozhuo) 前不久在看到一个作业"根据二叉树的先序和中序序列输出后序序列",当时我参考<数据结构与算法(C语言)习题集>上的做法,先根据先中序序列确定一颗二叉树,然后后序遍历二叉树输出后序序列. 函数采用了递归算法,利用函数传入的先序和中序序列的左右边界,确定要处理的序列段,生成相应的二叉树. 基本思路是,把该段先序序列的第一个元素作为当前二叉树的根结点,然后在中序序列找到根结点.根结点

数据结构已知先序和中序画出该树

这道题目很经典,具体如下: 已知遍历结果如下,试画出对应的二叉树: 前序:A B C E H F I J D G K 中序:A H E C I F J B D K G 解题要点: 1.前序.中序.后序--都针对中间那个节点而言(根节点也是中间的节点). 前序,指先遍历中间节点,然后左,然后右. 中序,指左--中--右. 后序,指右--中--左. 2.根据两种不同序列的遍历方法,便可画出二叉树. 解题答案如下:(对照着看会好理解这道题目一些的) 解题思路: 1.前序中序都首先找出A,推断出:A没有

(已知二叉树的中后,先中序两序遍历建树)

L2-006 树的遍历 题目链接 L2-006 树的遍历 (25 分) 给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列.这里假设键值都是互不相等的正整数. 输入格式: 输入第一行给出一个正整数N(≤),是二叉树中结点的个数.第二行给出其后序遍历序列.第三行给出其中序遍历序列.数字间以空格分隔. 输出格式: 在一行中输出该树的层序遍历的序列.数字间以1个空格分隔,行首尾不得有多余空格. 输入样例: 7 2 3 1 5 7 6 4 1 2 3 4 5 6 7 输出样例: 4 1 6 3

前序+中序 = 二叉树(先序、中序、后序、层次遍历)

内心OS:我靠啊!!!我就是偷了一下懒!!!把先序遍历的代码COPY了两份,改成了中序和后序遍历.万万没想到啊!我忘了修改函数中递归函数的名字!!!找这个BUG花了我三个小时~~我哭啊~~,我还以为我的知识体系坍塌了呢?!!~ 总结,这是一道模板题,要先记住大体流程,然后反复练习. 输入格式: 第一行给出结点个数 N(1<=N<= 50) 第二行给出先序序列,共N个整数 第三行给出后序序列,共N个整数 输出格式: 第一行给出先序遍历结果: 第二行给出中序遍历结果: 第三行给出后续遍历结果: 第

二叉树的前序中序后序遍历相互求法

二叉树的前中后序遍历,他们的递归非递归.还有广度遍历,参见二叉树的前中后序遍历迭代&广度遍历和二叉树的前中后序遍历简单的递归 现在记录已知二叉树的前序中序后序遍历的两个,求另外一个.一般,这两个中一定有中序遍历. 1.已知前序和中序,求后序遍历: 前序:ABDECFG  中序:DBEAFCG 思路简单:前序的第一个节点就是根节点, 中序中找到根节点的位置,根节点之前是其左子树,之后是右子树   按此顺序,依次在左子树部分遍历,右子树部分遍历 C++ 代码: TreeNode *BinaryTre

hihocoder(第十周)二叉树(前序中序推后续)递推实现

题目 : 后序遍历 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 在参与过了美食节之后,小Hi和小Ho在别的地方又玩耍了一阵子,在这个过程中,小Ho得到了一个非常有意思的玩具——一棵由小球和木棍连接起来的二叉树! 小Ho对这棵二叉树爱不释手,于是给它的每一个节点都标记了一个标号——一个属于A..Z的大写字母,并且没有任意两个节点的标号是一样的.小Hi也瞅准了这个机会,重新巩固了一下小Ho关于二叉树遍历的基础知识~就这样,日子安稳的过了两天. 这天,小Ho正好在求解