zoukankan      html  css  js  c++  java
  • 数据结构 树的遍历(中序非递归遍历)

    //树的遍历--非递归遍历
    
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include"LinkStack.h"
    
    /*
    步骤1:结点的所有路径情况
    如果结点有左子树,该结点入栈;
    如果结点没有左子树,访问该结点;
    分析3:路径所有情况
    如果结点有右子树,重复步骤1;
    如果结点没有右子树(结点访问完毕),回退,让栈顶元素出栈,访问栈顶元素,并访问右子树,重复步骤1
    如果栈为空,表示遍历结束。
    */
    
    //定义二叉树结构体
    typedef struct _TreeNode{
        char data;
        struct _TreeNode * leftchild;
        struct _TreeNode * rightchild;
    }TreeNode, *TreeNodePointer;
    
    TreeNodePointer GoLeft(TreeNodePointer root, LinkStack * stack){
        if (root == NULL || stack==NULL)
        {
            printf("参数不可以为空!
    ");
            return NULL;
        }
        while (root->leftchild){
            //入栈
            LinkStack_Push(stack, root);
            root = root->leftchild;
        }
        return root;
    }
    
    //树的非递归遍历
    void TreeErgodic(TreeNodePointer root){
        if (root==NULL)
        {
            return;
        }
        //1.创建栈
        LinkStack * stack = LinkStack_Create();
        if (stack == NULL)
        {
            printf("创建栈失败
    ");
            return;
        }
        /*
            如果结点有左子树,该结点入栈;
            如果结点没有左子树,访问该结点;
        */
        TreeNodePointer t = GoLeft(root, stack);
        /*
           此时t不可能为NULL,因为root不为NULL
        */
        printf("%c", t->data);
        while (t){
            //如果结点有右子树,重复步骤1;
            if (t->rightchild!=NULL)
            {
                t = GoLeft(t->rightchild, stack);
                printf("%c", t->data);
            }
            //如果结点没有右子树(结点访问完毕),回退,让栈顶元素出栈,访问栈顶元素,并访问右子树,重复步骤1
            else if (LinkStack_Size(stack)>0){
                t = (TreeNodePointer)LinkStack_Pop(stack);
                printf("%c", t->data);
            }
            //如果栈为空,表示遍历结束。
            else{
                t = NULL;
            }
        }
        //销毁栈
        LinkStack_Destroy(&stack);
    }
    
    void Test(){
        //定义结构体对象
        TreeNodePointer t1 = NULL, t2 = NULL, t3 = NULL, t4 = NULL, t5 = NULL,t6=NULL,t7=NULL,t8=NULL,t9=NULL;
        t1 = (TreeNodePointer)malloc(sizeof(TreeNode));
        if (t1 == NULL)
        {
            printf("分配内存失败!");
            goto END;
        }
        //初始化数据
        memset(t1, 0, sizeof(TreeNode));
        t2 = (TreeNodePointer)malloc(sizeof(TreeNode));
        if (t2 == NULL)
        {
            printf("分配内存失败!");
            goto END;
        }
        //初始化数据
        memset(t2, 0, sizeof(TreeNode));
        t3 = (TreeNodePointer)malloc(sizeof(TreeNode));
        if (t3 == NULL)
        {
            printf("分配内存失败!");
            goto END;
        }
        //初始化数据
        memset(t3, 0, sizeof(TreeNode));
        t4 = (TreeNodePointer)malloc(sizeof(TreeNode));
        if (t4 == NULL)
        {
            printf("分配内存失败!");
            goto END;
        }
        //初始化数据
        memset(t4, 0, sizeof(TreeNode));
        t5 = (TreeNodePointer)malloc(sizeof(TreeNode));
        if (t5 == NULL)
        {
            printf("分配内存失败!");
            goto END;
        }
        //初始化数据
        memset(t5, 0, sizeof(TreeNode));
        t6 = (TreeNodePointer)malloc(sizeof(TreeNode));
        if (t6 == NULL)
        {
            printf("分配内存失败!");
            goto END;
        }
        //初始化数据
        memset(t6, 0, sizeof(TreeNode));
        t7 = (TreeNodePointer)malloc(sizeof(TreeNode));
        if (t7 == NULL)
        {
            printf("分配内存失败!");
            goto END;
        }
        //初始化数据
        memset(t7, 0, sizeof(TreeNode));
        t8 = (TreeNodePointer)malloc(sizeof(TreeNode));
        if (t8 == NULL)
        {
            printf("分配内存失败!");
            goto END;
        }
        //初始化数据
        memset(t8, 0, sizeof(TreeNode));
        t9 = (TreeNodePointer)malloc(sizeof(TreeNode));
        if (t9 == NULL)
        {
            printf("分配内存失败!");
            goto END;
        }
        //初始化数据
        memset(t9, 0, sizeof(TreeNode));
        //填充数据域
        t1->data = 'A';
        t2->data = 'B';
        t3->data = 'C';
        t4->data = 'D';
        t5->data = 'E';
        t6->data = 'F';
        t7->data = 'G';
        t8->data = 'H';
        t9->data = 'I';
    
        //建立树之间的关系
        t1->leftchild = t2;
        t1->rightchild = t5;
    
        t2->leftchild = NULL;
        t2->rightchild = t3;
    
        t3->leftchild = t4;
        t3->rightchild = NULL;
    
        // t5是t4的左孩子
        t4->leftchild = NULL;
        t4->rightchild = NULL;
    
        //t5没有孩子节点
        t5->leftchild = NULL;
        t5->rightchild = t6;
    
        t6->leftchild = t7;
        t6->rightchild = NULL;
    
        t7->leftchild = t8;
        t7->rightchild = t9;
    
        t8->leftchild = NULL;
        t8->rightchild = NULL;
    
        t9->leftchild = NULL;
        t9->rightchild = NULL;
    
        //非递归遍历
        TreeErgodic(t1);
        printf("
    ");
    END:
        if (t1 != NULL)
        {
            free(t1);
            t1 = NULL;
        }
        if (t2 != NULL)
        {
            free(t2);
            t2 = NULL;
        }
        if (t3 != NULL)
        {
            free(t3);
            t3 = NULL;
        }
        if (t4 != NULL)
        {
            free(t4);
            t4 = NULL;
        }
        if (t5 != NULL)
        {
            free(t5);
            t5 = NULL;
        }
    }
    
    void main(){
        Test();
        system("pause");
    }

  • 相关阅读:
    几道简单容易被问的题
    java IO流学习总结
    Spark学习(二) -- Spark整体框架
    Spark学习(一) -- Spark安装及简介
    Python -- 数据加载、存储与文件格式
    Python库安装
    Python -- 基础
    reactive-turtle
    DP4J -- mnist
    初识DeepLearning4j
  • 原文地址:https://www.cnblogs.com/zhanggaofeng/p/5730960.html
Copyright © 2011-2022 走看看