算法学习 - 表达树的建立(后缀表达式法),树的先序遍历,中序遍历,后序遍历(非递归)

Posted yxysuanfa

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法学习 - 表达树的建立(后缀表达式法),树的先序遍历,中序遍历,后序遍历(非递归)相关的知识,希望对你有一定的参考价值。

表达树就是依据后缀表达式来建立一个二叉树。

这个二叉树的每一个叶子节点就是数。真祖先都是操作符。

通过栈来建立的,所以这里也会有非常多栈的操作。

树的先序遍历。中序遍历。后序遍历的概念我就不讲了,不会的自行百度,不然也看不懂我的代码。

以下是代码:

//
//  main.cpp
//  expressionTree
//
//  Created by Alps on 14-7-29.
//  Copyright (c) 2014年 chen. All rights reserved.
//

#include <iostream>
#define ElementType char

using namespace std;

struct Tree;
typedef Tree* TreeNode;

struct Node;
typedef Node* PtrToNode;
typedef PtrToNode Stack;

struct Tree{
    ElementType element;
    TreeNode  left;
    TreeNode  right;
};

struct Node{
    TreeNode rootNode;
    Stack Next;
};
/****************** Stack operate ****************/

Stack createStack(void){
    Stack S = (Stack)malloc(sizeof(Stack));
    S->Next = NULL;
    return S;
}

int isEmptyStack(Stack S){
    return S->Next == NULL;
}

void Push(TreeNode T, Stack S){
    Stack SNode = (Stack)malloc(sizeof(Node));
    SNode->rootNode = NULL;
    SNode->Next = NULL;
    SNode->rootNode = T;
    SNode->Next = S->Next;
    S->Next = SNode;
}

TreeNode Top(Stack S){
    if (!isEmptyStack(S)) {
        return S->Next->rootNode;
    }else{
//        printf("stack is empty, can‘t get top element!\n");
        return NULL;
    }
}

void Pop(Stack S){
    if (!isEmptyStack(S)) {
        Stack tmp = S->Next;
        S->Next = tmp->Next;
        free(tmp);
        tmp = NULL;
    }else{
        printf("stack is empty, can‘t pop the stack!\n");
        exit(1);
    }
}

Stack switchStack(Stack S){
    Stack tmp = (Stack)malloc(sizeof(Node));
    Stack switchTmp = S->Next;
    while (switchTmp != NULL) {
        Push(switchTmp->rootNode, tmp);
        switchTmp = switchTmp->Next;
    }
    return tmp;
}

int findStack(TreeNode T, Stack S){
    Stack tmp = S->Next;
    while (tmp != NULL) {
        if (tmp->rootNode == T) {
            return 1;
        }
        tmp = tmp->Next;
    }
    return 0;
}

void PrintStack(Stack S){
    if (S == NULL) {
        printf("please create stack first!\n");
        exit(1);
    }
    Stack tmp = S->Next;
    while (tmp != NULL) {
        ElementType X = tmp->rootNode->element;
        printf("%c ",X);
        tmp = tmp->Next;
    }
    printf("\n");
    
}
/****************** Tree operate ****************/

TreeNode createNode(ElementType X){
    TreeNode expressionTree = (TreeNode)malloc(sizeof(Tree));
    expressionTree->element = X;
    expressionTree->left = NULL;
    expressionTree->right = NULL;
    return expressionTree;
}

TreeNode createTree(ElementType A[], int length, Stack S){
    int i = 0;
    TreeNode tmpNode;
    for (i = 0; i < length; i++) {
        tmpNode = createNode(A[i]);
        if (tmpNode->element == ‘+‘ || tmpNode->element == ‘-‘ || tmpNode->element == ‘*‘ || tmpNode->element == ‘/‘) {
            tmpNode->right = Top(S);
            Pop(S);
            tmpNode->left = Top(S);
            Pop(S);
            Push(tmpNode, S);
        }else{
            Push(tmpNode, S);
        }
    }
    return S->Next->rootNode;
}

int PushTreeNode(TreeNode T, Stack S){
    if (T == NULL) {
        return 0;
    }else{
        Push(T, S);
        PushTreeNode(T->left, S);
        PushTreeNode(T->right, S);
    }
    return 0;
}


void PreorderPrint(TreeNode T){
    Stack S = createStack();
    if (T == NULL) {
        printf("empty tree\n");
        exit(1);
    }
    PushTreeNode(T, S);
    S = switchStack(S);
    PrintStack(S);
}

void inOrder(TreeNode T){
    Stack S = createStack();
    TreeNode tmpTree;
    if (T == NULL) {
        printf("empty tree\n");
        exit(1);
    }
    while (T) {
        Push(T, S);
        T = T->left;
        if (T == NULL) {
            while (1) {
                tmpTree = Top(S);
                if (tmpTree == NULL) {
                    break;
                }
                printf("%c ",tmpTree->element);
                if (tmpTree->right != NULL) {
                    T = tmpTree->right;
                    Pop(S);
                    break;
                }else{
                    Pop(S);
                }
            }
        }
    }
    printf("\n");
}

void afterPreorder(TreeNode T){
    Stack S = createStack();
    TreeNode tmpTree;
    Stack saveS = createStack();
    if (T == NULL) {
        printf("empty tree\n");
        exit(1);
    }
    while (T) {
        Push(T, S);
        T = T->left;
        if (T == NULL) {
            while (1) {
                tmpTree = Top(S);
                if (tmpTree == NULL) {
                    break;
                }
                if (tmpTree->right != NULL) {
                    if (findStack(tmpTree, saveS)) {
                        printf("%c ",tmpTree->element);
                        Pop(S);
                        continue;
                    }
                    Push(tmpTree, saveS);
                    T = tmpTree->right;
                    break;
                }else{
                    printf("%c ",tmpTree->element);
                    Pop(S);
                }
            }
        }
    }
    printf("\n");
}

/****************** Main        ****************/



int main(int argc, const char * argv[])
{
    char A[] = {‘a‘,‘b‘,‘+‘,‘c‘,‘d‘,‘e‘,‘+‘,‘*‘,‘*‘};
    Stack S = createStack();
    int length = sizeof(A)/sizeof(char);
    TreeNode T = createTree(A, length, S);
//    printf("%lu\n",sizeof(Node));
    printf("create Tree success!\n");
    PreorderPrint(T);
    inOrder(T);
    afterPreorder(T);
    return 0;
}

代码就是这些~~不懂的留言评论好了~

以上是关于算法学习 - 表达树的建立(后缀表达式法),树的先序遍历,中序遍历,后序遍历(非递归)的主要内容,如果未能解决你的问题,请参考以下文章

博客作业04--树

根据二叉树的先序遍历结果输出中序遍历

Java实现后缀表达式建立表达式树

noip复赛会考哪些类型的题目?该如何复习?

建立二叉树的二叉链表表示,实现二叉树的先序、中序、后序和按层次遍历,统计并输出结点个数。

表达式求值