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

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

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

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

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

下面是代码:

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

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

算法学习 - 表达树的建立(后缀表达式法),树的先序遍历,中序遍历,后序遍历,布布扣,bubuko.com

时间: 2024-10-06 22:10:54

算法学习 - 表达树的建立(后缀表达式法),树的先序遍历,中序遍历,后序遍历的相关文章

算法学习 - Hash Table操作,分离链接法解决哈希冲突

分离链接法 hash table是映射机制的,最大的优点就是它的操作是O(1)级别的.但是会出现哈希冲突,这就需要几种办法来解决.这里先说一种:分离链接法. 就是当插入的位置已经存在一个值之后,那么在这个值之后插入,就可以了,也叫拉链法.(但是其实会降低查找速度,变成O(n)级别) 下面是代码: // // main.cpp // HashTable_SeparateChaining // // Created by Alps on 14-8-5. // Copyright (c) 2014年

算法学习01:二分查询,选择法、插入法、分治法排序

查询与排序是使用的再频繁不过的两个功能,算法学习系列实现语言为C#. 一般情况下的查询 Int32 Search(Int32[] source, Int32 task) { var index = 0; while (index < source.Length) if (source[index++] == task) return index - 1; //返回值为Length则说明未找到 return source.Length; } 时间复杂度为O(n),在检索源没有排序的情况下,这即为最

作业 树和森林 遍历(递归/非递归先序,递归/非递归后序,递归层次)

1 #include <iostream> 2 #include"queue.h"//之前写的类 3 #include"stack.h" //之前写的类 4 using namespace std; 5 6 template <class T> 7 class Tree; 8 9 //======================================== 10 // 树节点类声明 11 template <class T>

【算法学习笔记】86.栈 中缀表达式 SJTU OJ 1033 表达式计算

...被输入给坑了 应该先把所有的空格删掉再玩  还有就是测试点里好像根本就没有关于后结合的事情...不过后结合也很简单 控制一下优先级的判断即可. 中缀表达式的处理核心就是两个堆栈的维护 一个是 操作符 一个是 操作数 只有当 当前正在处理的操作符的优先级大于(不考虑后结合时) 栈顶操作符的时候, 才进行计算.(或者出现右括号时 一直计算到左括号出现) 代码比较长 用了struct来存储token 比较清晰. #include <iostream> #include <stack>

我的算法学习之路

关于 严格来说,本文题目应该是我的数据结构和算法学习之路,但这个写法实在太绕口--况且CS中的算法往往暗指数据结构和算法(例如算法导论指的实际上是数据结构和算法导论),所以我认为本文题目是合理的. 这篇文章讲了什么? 我这些年学习数据结构和算法的总结. 一些不错的算法书籍和教程. 算法的重要性. 初学 第一次接触数据结构是在大二下学期的数据结构课程.然而这门课程并没有让我入门--当时自己正忙于倒卖各种MP3和耳机,对于这些课程根本就不屑一顾--反正最后考试划个重点也能过,于是这门整个计算机专业本

Peng Gong:我的算法学习之路

原文出处: Lucida (@peng_gong) 关于 严格来说,本文题目应该是我的数据结构和算法学习之路,但这个写法实在太绕口--况且CS中的算法往往暗指数据结构和算法(例如算法导论指的实际上是数据结构和算法导论),所以我认为本文题目是合理的. 这篇文章讲了什么? 我这些年学习数据结构和算法的总结. 一些不错的算法书籍和教程. 算法的重要性. 初学 第一次接触数据结构是在大二下学期的数据结构课程.然而这门课程并没有让我入门--当时自己正忙于倒卖各种MP3和耳机,对于这些课程根本就不屑一顾--

转----我的算法学习之路

我的算法学习之路 关于 严格来说,本文题目应该是我的数据结构和算法学习之路,但这个写法实在太绕口——况且CS中的算法往往暗指数据结构和算法(例如算法导论指的实际上是数据结构和算法导论),所以我认为本文题目是合理的. 原文链接:http://zh.lucida.me/blog/on-learning-algorithms/ 原文作者:Lucida 这篇文章讲了什么? 我这些年学习数据结构和算法的总结. 一些不错的算法书籍和教程. 算法的重要性. 初学 第一次接触数据结构是在大二下学期的数据结构课程

一位Google程序员的算法学习之路(转)

关于 严格来说,本文题目应该是我的数据结构和算法学习之路,但这个写法实在太绕口——况且CS中的算法往往暗指数据结构和算法(例如算法导论指的实际上是数据结构和算法导论),所以我认为本文题目是合理的. 这篇文章讲了什么? 我这些年学习数据结构和算法的总结. 一些不错的算法书籍和教程. 算法的重要性. 初学 第一次接触数据结构是在大二下学期的数据结构课程.然而这门课程并没有让我入门——当时自己正忙于倒卖各种MP3和耳机,对于这些课程根本就不屑一顾——反正最后考试划个重点也能过,于是这门整个计算机专业本

[收藏]我的算法学习之路

转自:http://zh.lucida.me/blog/on-learning-algorithms/ 关于 严格来说,本文题目应该是我的数据结构和算法学习之路,但这个写法实在太绕口--况且CS中的算法往往暗指数据结构和算法(例如算法导论指的实际上是数据结构和算法导论),所以我认为本文题目是合理的. 原文链接:http://zh.lucida.me/blog/on-learning-algorithms/ 原文作者:Lucida 这篇文章讲了什么? 我这些年学习数据结构和算法的总结. 一些不错的