栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

文章目录
  • 7-1 zigzagging on a tree
    • 1. Question
    • 2. Solution
        • 2.1 递归建树
        • 2.2 双堆栈之字遍历
    • 3. Source code

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. 由中序确定左右子树的前序和后序序列(中序序列根节点之前为左子树中序序列,根节点之后为右子树中序序列;再由子树序列节点数和后序序列可确定左右子树的后序序列)
  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
#include
#include

#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(void);
bool Sis_empty(Stack S);
Tree pop(Stack S);
void push(Stack S, Tree x);

Tree build_tree(element_type inorder[], element_type postorder[], int n);
void traverse_level(Tree T);
void traverse_zigzagging(Tree T);

int main(void)
{
    int n;
    scanf("%d",&n);
    element_type inorder[n],postorder[n];

    for(int i=0;iitem=postorder[n-1];
    while(inorder[index++]!=postorder[n-1]);
    T->left=build_tree(inorder,postorder,index-1);
    T->right=build_tree(inorder+index,postorder+index-1,n-index);

    return T;
}

void traverse_zigzagging(Tree T)
{
    Stack S1=creat_stack();
    Stack S2=creat_stack();

    push(S1,T);
    while(Sis_empty(S1)==false || Sis_empty(S2)==false)
    {
        if(Sis_empty(S2)==true)
        {
            while(Sis_empty(S1)==false)
            {
                T=pop(S1);
                if(T->right){
                    push(S2,T->right);
                }
                if(T->left){
                    push(S2,T->left);
                }
                printf((Sis_empty(S1) && Sis_empty(S2))?"%d":"%d ",T->item);
            }

        }else if(Sis_empty(S1)==true){
            while(Sis_empty(S2)==false)
            {
                T=pop(S2);
                if(T->left){
                    push(S1,T->left);
                }
                if(T->right){
                    push(S1,T->right);
                }
                printf((Sis_empty(S1) && Sis_empty(S2))?"%d":"%d ",T->item);
            }        
        }
    }
}

Stack creat_stack(void)
{
    Stack S=(Stack)malloc(sizeof(struct stack));
    S->top=-1;
    return S;
}
bool Sis_empty(Stack S)
{
    return S->top==-1?true:false;
}
Tree pop(Stack S)
{
    return S->top==-1?NULL:S->Data[S->top--];
}
void push(Stack S, Tree x)
{
    S->Data[++S->top]=x;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/330175.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号