zoukankan      html  css  js  c++  java
  • 二叉树的基本操作

    #include <stdio.h>
    #include <stdlib.h>
    #define Maxsize 100
    typedef char ElemType;
    
    //二叉树的链式存储结构
    typedef struct BitNode
    {
        ElemType data;
        struct BitNode *lchild,*rchild;
    }BitNode,*BitTree;
    
    //二叉树的NLR递归创建
    void Create_BitTree(BitTree &tree)
    {
        char ch;
        if ((ch=getchar())=='#')
            tree=NULL;
        else
        {
            tree=(BitNode*)malloc(sizeof(BitNode));
            tree->data=ch;
            Create_BitTree(tree->lchild);
            Create_BitTree(tree->rchild);
        }
    }
    
    /*
     * 二叉树的遍历部分
     */
    //二叉树的先序递归遍历 NLR
    void PreOrder(BitTree tree)
    {
        if (tree==NULL)
            return;  //什么也不做
        else
        {
            printf("%c ",tree->data);  //先输出根节点
            PreOrder(tree->lchild);   //在输出左子树
            PreOrder(tree->rchild);   //在输出右子树
        }
    }
    //二叉树的中序递归遍历 NLR
    void InOrder(BitTree tree)
    {
        if (tree==NULL)
            return;
        else
        {
            InOrder(tree->lchild); //先输出左子树
            printf("%c ",tree->data);  //在输出根节点
            InOrder(tree->rchild);   //最后输出右子树
        }
    }
    //二叉树的后序递归遍历 LRN
    void LastOrder(BitTree tree)
    {
        if (tree==NULL)
            return;
        else
        {
            LastOrder(tree->lchild);
            LastOrder(tree->rchild);
            printf("%c ",tree->data);
        }
    }
    //二叉树的先序非递归遍历  NLR--- 栈 (用一维数组模拟)
    void PreOrder1(BitTree tree)
    {
        BitTree Stack[Maxsize];  //创建大小为100的顺序栈
        int top=-1;  //栈顶指针
    
        while (tree!=NULL || top!=-1)   //二叉树非空或栈非空循环
        {
            if (tree)
            {
                printf("%c ",tree->data);  //输出根节点
                Stack[++top]=tree;       //入栈
                tree=tree->lchild;      //访问左子树
            }
            else
            {
                tree=Stack[top--];  //出栈操作
                tree=tree->rchild;  //访问右子树
            }
        }
    }
    //二叉树的中序非递归遍历 LNR -- 栈
    void InOrder1(BitTree tree)
    {
        BitTree Stack[Maxsize];  //顺序栈
        int top=-1;  //栈顶指针,初始为-1,同时,top==-1表示空栈
    
        while (tree!=NULL || top!=-1) //二叉树非空,或者栈非空时循环
        {
            if (tree)  //结点存在
            {
                Stack[++top]=tree;   //入栈操作
                tree=tree->lchild;  //访问左子树
            }
            else   //结点不存在
            {
                tree=Stack[top--];  //出栈操作
                printf("%c ",tree->data);  //输出左子树结点
                tree=tree->rchild;      //访问右子树
            }
        }
    
    }
    //二叉树的层次遍历   --队列
    void CengOrder(BitTree tree)
    {
        BitTree Qunue[Maxsize];
        int rear,front;
        rear=front=-1;
    
        Qunue[++rear]=tree;
        while (rear>front)   //队列不空
        {
            tree=Qunue[++front];
            printf("%c ",tree->data);
            if (tree->lchild)
                Qunue[++rear]=tree->lchild;
            if (tree->rchild)
                Qunue[++rear]=tree->rchild;
        }
    }
    //二叉树的深度   -- 队列非递归
    void Level_Depth(BitTree tree)
    {
        int rear,front,last,level;
        BitTree Qunue[Maxsize];
        rear=front=-1;
        level=0;
        Qunue[++rear]=tree;  //入队列
        last=rear;
        while (rear>front)
        {
            tree=Qunue[++front]; //出队列
            if (tree->lchild)
                Qunue[++rear]=tree->lchild;
            if (tree->rchild)
                Qunue[++rear]=tree->rchild;
            if (front==last)
            {
                level++;
                last=rear;
            }
        }
        printf("二叉树高度是:%d
    ",level);
    }
    //二叉树的递归求深度     递归具有自我增长性,调用一次返回值+1 (前提是不修改返回值)
    int Depth(BitTree tree)
    {
        int left;
        int right;
        if (tree==NULL)
            return 0;
        else
        {
            left=Depth(tree->lchild);
            right=Depth(tree->rchild);
        }
        return left>right?(left+1):(right+1);
    }
    //求二叉树中某结点的指针地址
    BitTree Address(BitTree tree,ElemType value)
    {
        BitTree p;
        if (tree==NULL)
            return NULL;
        else if (tree->data==value)
            return tree;
        else
        {
            p=Address(tree->lchild,value);
            if (p!=NULL)
                return p;
            else
                return Address(tree->rchild,value);
        }
    }
    //递归复制一棵二叉树
    BitTree Copy(BitTree tree,BitTree &tree1)
    {
        if (tree==NULL)
            tree1=NULL;
        else
        {
            tree1=(BitTree)malloc(sizeof(BitNode));
            tree1->data=tree->data;     //先复制根节点
            Copy(tree->lchild,tree1->lchild);   //先复制左子树
            Copy(tree->rchild,tree1->rchild);  //在复制右子树
        }
    }
    //递归交换二叉树的左右子树 NLR  --不修改自身结构(tree1,是自身的一个副本)
    void Swap_l_r(BitTree tree,BitTree &tree1)
    {
        if (tree==NULL)
            tree1=NULL;
        else
        {
            tree1->data=tree->data;    //先交换根节点
            Swap_l_r(tree->lchild,tree1->rchild);  //在交换左子树
            Swap_l_r(tree->rchild,tree1->lchild);  //在交换右子树
        }
    }
    //递归求出二叉树的所有叶子节点
    void Leaves(BitTree tree)
    {
        if (tree==NULL)
            return;
        else
        {
            if (tree->lchild==NULL && tree->rchild==NULL)  //先判断根节点是不是叶子节点
                printf("%c ",tree->data);
            Leaves(tree->lchild);    //判断左子树是不是叶子节点
            Leaves(tree->rchild);   //判断右子树有没有叶子节点
        }
    }
    //递归销毁二叉树  LRN
    void DestoryBitTree(BitTree &tree)
    {
        if (tree==NULL)
            return;
        else
        {
            DestoryBitTree(tree->lchild);  //销毁左子树
            DestoryBitTree(tree->rchild);  //销毁右子树
            free(tree);   //销毁根节点
        }
    }
    
    
    int main()
    {
        BitTree tree,tree1;
        Create_BitTree(tree);
        LastOrder(tree);
        Copy(tree,tree1);
        putchar('
    ');
        Swap_l_r(tree,tree1);
        LastOrder(tree1);
        printf("叶子节点为:");
        Leaves(tree);
        DestoryBitTree(tree);
        DestoryBitTree(tree1);
        return 0;
    }
  • 相关阅读:
    蚂蚁的难题(一) http://acm.nyist.net/JudgeOnline/status.php?pid=744
    快速查找素数 http://acm.nyist.net/JudgeOnline/problem.php?pid=187
    我排第几个 http://acm.nyist.net/JudgeOnline/problem.php?pid=139
    求余数 http://acm.nyist.net/JudgeOnline/problem.php?pid=205
    九的余数 http://acm.nyist.net/JudgeOnline/problem.php?pid=105
    次方求模 http://acm.nyist.net/JudgeOnline/problem.php?pid=102
    汉诺塔(一)http://acm.nyist.net/JudgeOnline/problem.php?pid=88
    换博客了,欢迎访问
    linux下使用kpartx挂载虚拟文件系统
    编译linux内核时出错
  • 原文地址:https://www.cnblogs.com/nanfengnan/p/14664743.html
Copyright © 2011-2022 走看看