zoukankan      html  css  js  c++  java
  • 算法学习

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

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

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

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

    以下是代码:

    //
    //  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!
    ");
            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!
    ");
            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!
    ");
            exit(1);
        }
        Stack tmp = S->Next;
        while (tmp != NULL) {
            ElementType X = tmp->rootNode->element;
            printf("%c ",X);
            tmp = tmp->Next;
        }
        printf("
    ");
        
    }
    /****************** 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
    ");
            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
    ");
            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("
    ");
    }
    
    void afterPreorder(TreeNode T){
        Stack S = createStack();
        TreeNode tmpTree;
        Stack saveS = createStack();
        if (T == NULL) {
            printf("empty tree
    ");
            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("
    ");
    }
    
    /****************** 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
    ",sizeof(Node));
        printf("create Tree success!
    ");
        PreorderPrint(T);
        inOrder(T);
        afterPreorder(T);
        return 0;
    }
    

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

  • 相关阅读:
    读书笔记之理想设计的特征
    一些javascript 变量声明的 疑惑
    LINQ 使用方法
    Google MySQL tool releases
    读书笔记之设计的层次
    EF之数据库连接问题The specified named connection is either not found in the configuration, not intended to be used with the Ent
    转载 什么是闭包
    javascript面向对象起步
    Tips
    数据结构在游戏中的应用
  • 原文地址:https://www.cnblogs.com/yxysuanfa/p/7047151.html
Copyright © 2011-2022 走看看