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.
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直到左右子树长度变为0
2.2 双堆栈之字遍历
理论出发点:堆栈FILO特性
具体操作:
- 创建两个堆栈S1、S2
- 将根节点压入S1
- S1依次出栈并访问(打印),同时将对应子节点按右左顺序压入S2,直到S1空栈
- S2依次出栈并访问(打印),同时将对应子节点按左右顺序压入S1,直到S2空栈
- 重复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