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;
    }
    

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

  • 相关阅读:
    vim 命令
    navicat 破解
    vim 使用技巧记录
    Ubuntu 16.04 安装ftp服务器
    mockito测试入门学习
    Java的getClass()函数
    JQuery中Ajax的操作
    JS中获取元素使用getElementByID()、getElementsByName()、getElementsByTagName()的用法和区别
    Tomcat下ajax请求路径总结
    javascript:void()的理解
  • 原文地址:https://www.cnblogs.com/yxysuanfa/p/7047151.html
Copyright © 2011-2022 走看看