从下至上按层遍历由广义表(节点为数字)构造的二叉树

原创 2014年12月02日 12:59:06

【问题描述】
 给定一颗二叉树,要求从下至上按层遍历二叉树,每层的访问顺序是从左到右,每一层单独输出一行。

【输入形式】
 广义表表示的二叉树,结点元素类型为整型,且都大于0,例如:1( 2( 3 ( 4, 5 ) ), 6( 7, 8( 9, 10 ) ) )

【输出形式】
 从下至上,打印每一层的结点元素值,元素间以空格隔开。每层的访问顺序是从左到右,每一层单独输出一行。

【样例输入】
 1(2(3(4,5)),6(7,8(9,10))),字符串内没有空格

【样例输出】
 4 5 9 10
 3 7 8
 2 6
 1

【样例说明】

【评分标准】
 本题目主要考察两个知识点:
 1.创建二叉树存储结构
 2.按层次遍历二叉树的算法

/*
由于是倒着从最后一层开始从左至右按层遍历
所以面临以下问题:
1.如何根据广义表构造树(注意节点不是字母,而是数字(可能是多位数)!!!!!)
2.如何从最后一层依次向上面的层遍历
3.如何输出一层之后换行再输出另一行

针对问题2,只要在按层遍历的时候从右至左遍历,最后输出到数组里,再将数组逆序输出就好
针对问题3,就是设置一个东西来记录节点的层数。这里用到了二维数组,int a[][2],
	其中a[][0]用来记录节点的数字,a[][1]用来记录层数
针对问题1,解决办法是先用gets将广义表读入字符串s[],然后依次从开头往后读,
	发现‘0’~‘9’之间的字符,就放到字符数组num[]中,直到不再是‘0’~‘9’之间的字符,
	然后将num[]转换成数字(可以用sscanf)
*/
#include<stdio.h>
#include<stdlib.h>						// malloc()
#include<string.h>						// strlen(), memset()

#define MAXSIZE 100

typedef struct node
{
	int data;
	int depth;						//记录深度,同一深度输出到同一行
	struct node *lchild, *rchild;
}BTNode, *BTREE;

int a[MAXSIZE][2];						//二维数组,分别记录节点值和深度

BTREE create_BT();
int layer(BTREE T);

int main()
{
	BTREE T;
	int i = 0, dep;

	T = create_BT();					//根据广义表构建树
	i = layer(T);						//按层遍历,从右至左

	dep = a[i][1];
	for(; i>=0; i--)					//遍历所有的节点以输出
	{
		if(dep!=a[i][1])				//如果发现深度跟之前的不同,就换行
		{
			printf("\n");
			dep = a[i][1];
		}
		printf("%d ", a[i][0]);
	}
	return 0;
}

BTREE create_BT()
{
	BTREE stack[MAXSIZE], p, T = NULL;
	char ch, s[MAXSIZE] = {0}, num[10] = {0};
	int flag, top = -1, len, i = 0, j = 0, sum = 0;

	fgets(s, MAXSIZE-1, stdin);			//先读到数组中,这样做,数据就可以重复读了!
	len = strlen(s);

	while(1)
	{
		memset(num, '\0', 10);			//每次别忘了对num清零!
		ch = s[i];

		if(s[i] >= '0' && s[i] <= '9')	        //发现一个字符是'0'~'9',可能是多位数
        {
            j = 0;
            while(s[i] >= '0' && s[i] <= '9')
            {
                num[j++] = s[i++];
            }
            sscanf(num, "%d", &sum);	                //sscanf字符串转数字
        }
        else
            i++;					//如果不是数字,要i++,下次就可以读下一个字符

        if( ch == '\n' || i >= len)		        //发现'\n'或者是s[]到头了就返回
            return T;
		else
		{
			switch(ch)
			{
				case '(' : stack[++top] = p;
						   flag = 1;
						   break;
				case ')' : top--;
						   break;
				case ',' : flag = 2;
						   break;
				default  : p = (BTREE)malloc(sizeof(BTNode));
						   p -> data = sum;
						   p -> depth = 0xfffffff;
						   p -> lchild = NULL;
						   p -> rchild = NULL;
						   if(T == NULL)
						   {
								T = p;
								p -> depth = 1;			//记录深度
						   }
						   else if(flag == 1)
								{
									stack[top] -> lchild = p;
									p -> depth = top+2;	//记录深度
								}
						   else
								{
									stack[top] -> rchild = p;
									p -> depth = top+2;	//记录深度
								}
			}
		}
	}
}

int layer(BTREE T)
{
	BTREE queue[MAXSIZE], p;
	int front, rear, i = 0;
	if(T != NULL)
	{
		queue[0] = T;
		front = -1;
		rear = 0;
		while(front < rear)
		{
			p = queue[++front];
			a[i][0] = p -> data;
			a[i++][1] = p -> depth;				//将遍历的节点记录到a[][]
			if(p->rchild != NULL)				//先右,便是从右至左遍历
				queue[++rear] = p -> rchild;
			if(p->lchild != NULL)
				queue[++rear] = p -> lchild;
		}
	}

	return --i;							//返回节点个数!别忘了是--i
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

数据结构与算法简记:根据广义表构建二叉树

使用广义表(generalized lists)来表示二叉树非常方便,假如我们有这么一个二叉树: 它可以表示为L = (A (B (C, D), E ( , F)) ),直观地表达了树中各个节点...
  • liuhe688
  • liuhe688
  • 2016年07月07日 11:56
  • 2717

二叉树的层次遍历(从上到下和从下到上两种)

问题一:给定一颗二叉树,返回对这颗二叉树的层次遍历的结果。本次层次遍历要求对树从上到下,从左到右的方向遍历。 比如:有如下二叉树 3 / \ 9 20 / \ 1...
  • sunzz679
  • sunzz679
  • 2015年03月31日 11:03
  • 1004

二叉树的按层遍历法

程序自己写的,肯定能运行,代码啰不啰嗦暂且不考虑了。 程序功能:【实现二叉树的按层遍历法】 编程关键点:【建立一个队列】【函数递归】 编程思想: 二叉树分好多层,因为要按层遍历,所以如果直接采用函数递...
  • lingchen2348
  • lingchen2348
  • 2016年10月10日 10:09
  • 2500

由遍历序列构造二叉树

由遍历序列构造二叉树
  • zj20320
  • zj20320
  • 2016年07月31日 23:32
  • 1198

广义表表示二叉树结构生成二叉链表的算法

BinTNode* CreatTree(char str[]){ BinTNode* st[100]; //存放父结点的顺序栈; BinTNode *p=N...
  • rzchong1988
  • rzchong1988
  • 2012年08月10日 10:39
  • 1950

二叉树的建立(广义表)及3种遍历

/*****************************************************  Copyright (C)  FileName: BiTree.c  Author: L...
  • qinglu
  • qinglu
  • 2007年11月09日 15:53
  • 797

LeetCode之二叉树按层从下往上遍历

题目描述:/** * Given a binary tree, return the bottom-up level order traversal of its nodes' values. (...
  • u011521382
  • u011521382
  • 2016年07月18日 11:38
  • 3303

根据中序和层次遍历序列,构造二叉树

代码如下,思路详见注释: #include #include #include using namespace std; typedef struct Bitree{ char data; s...
  • Singular__point
  • Singular__point
  • 2016年12月31日 11:31
  • 1446

二叉树(6)----按层遍历二叉树

1、二叉树定义 typedef struct BTreeNodeElement_t_ { void *data; } BTreeNodeElement_t; typedef struct ...
  • beitiandijun
  • beitiandijun
  • 2014年12月15日 10:10
  • 2045

二叉树按层遍历打印的算法(c/c++)

void LevelOrder(BTree T, int cnt) { BTree level = malloc(sizeof(struct BTNode)*cnt); if(leve...
  • zhuisui8
  • zhuisui8
  • 2016年10月30日 16:15
  • 169
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:从下至上按层遍历由广义表(节点为数字)构造的二叉树
举报原因:
原因补充:

(最多只允许输入30个字)