1.zigzagging on a tree(C语言实现)

该博客介绍了如何使用C语言实现二叉树的之字形遍历。首先,从问题引入,说明在给定二叉树的中序和后序遍历序列的情况下,如何按照水平交替方向(左到右,右到左)打印树的节点。然后,提供了两种解决方案:递归建树法和双堆栈之字遍历法,详细解释了每种方法的理论依据和具体步骤,并附带了源代码。
摘要由CSDN通过智能技术生成

7-1 zigzagging on a tree

1. Question

Introduction:

​ Suppose that all the keys in a binary tree are distinct positive integers. A unique binary tree can be determined by a given pair of postorder and inorder traversal sequences. And it is a simple standard routine to print the numbers in level-order. However, if you think the problem is too simple, then you are too naive. This time you are supposed to print the numbers in “zigzagging order” – that is, starting from the root, print the numbers level-by-level, alternating between left to right and right to left. For example, for the following tree you must output: 1 11 5 8 17 12 20 15.

zigzag.jpg

Input Specification:

​ Each input file contains one test case. For each case, the first line gives a positive integer N (≤30), the total number of nodes in the binary tree. The second line gives the inorder sequence and the third line gives the postorder sequence. All the numbers in a line are separated by a space.

Output Specification:

​ For each test case, print the zigzagging sequence of the tree in a line. All the numbers in a line must be separated by exactly one space, and there must be no extra space at the end of the line.

Sample Input:

8
12 11 20 17 1 15 8 5
12 20 17 11 15 8 5 1

Sample Output:

1 11 5 8 17 12 20 15

2. Solution

2.1 递归建树

理论出发点:一棵树可以由中序和前序或者中序和后序序列唯一确定。
具体操作(以后序为例):

  1. 由后序确定根节点(后序序列最后一个节点即为这棵树的根节点)
  2. 由中序确定左右子树的前序和后序序列(中序序列根节点之前为左子树中序序列,根节点之后为右子树中序序列;再由子树序列节点数和后序序列可确定左右子树的后序序列)
  3. 递归地重复1、2直到左右子树长度变为0
2.2 双堆栈之字遍历

理论出发点:堆栈FILO特性
具体操作

  1. 创建两个堆栈S1、S2
  2. 将根节点压入S1
  3. S1依次出栈并访问(打印),同时将对应子节点按右左顺序压入S2,直到S1空栈
  4. S2依次出栈并访问(打印),同时将对应子节点按左右顺序压入S1,直到S2空栈
  5. 重复3、4直到S1和S2同时空栈

3. Source code

#include<stdio.h>
#include<stdbool.h>
#include<stdlib.h>

#define MAX 100

typedef int element_type;
typedef struct tree_node *Tree;
struct tree_node{
   
    element_type item;
    Tree left;
    Tree right;
};
//Tree的链表节点定义

typedef struct stack *Stack;
struct stack{
   
    Tree Data[MAX];
    int top;
};
//Stack的顺序存储定义

Stack creat_stack
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值