首页 > 其他分享 >二叉树相关上机实验

二叉树相关上机实验

时间:2022-11-07 17:36:14浏览次数:58  
标签:sta 上机 blink 实验 二叉树 printf rchild NULL root

#include<stdio.h>
#include<malloc.h>
#define OK 1
#define ERROR 0
#define MAXNUM 20
typedef int Status;
typedef struct bnode
{
    int data;
    struct bnode *lchild,*rchild;
}bnode_type,*blink;
typedef struct Stack
{
    blink data[MAXNUM];
    int top;
}Stack;
Status create(blink &root);
void preorder_1(blink root);
void inorder_1(blink root);
void postorder_1(blink root);
void preorder_2(blink root);
void inorder_2(blink root);
void postorder_2(blink root);
void create_stack(Stack &S);
Status empty(Stack S);
void push(Stack &S, blink BTN);
blink pop(Stack &S);
int treelen(blink tree);
int leaves(blink tree);
int nodes(blink root);
int main()
{
    blink mytree;
    create(mytree);
    printf("\npreorder:\n");
    preorder_1(mytree);
    printf("\ninorder:\n");
    inorder_1(mytree);
    printf("\npostorder:\n");
    postorder_1(mytree);    
    printf("\n----------------\n");
    printf("\npreorder:\n");
    preorder_2(mytree);
    printf("\ninorder:\n");
    inorder_2(mytree);
    printf("\npostorder:\n");
    postorder_2(mytree);    
    printf("\n----------------\n");
    printf("the depth of this tree is: %d",treelen(mytree));
    printf("\nthere are %d leaves in this tree",leaves(mytree));
    printf("\nthere are %d nodes in this tree",nodes(mytree));
}
Status create(blink &root)
{
    blink p,q;
    int k;
    int i,n;
    root=NULL;
    printf("input n:");
    scanf("%d",&n);
    if(n<=0)
    {
        printf("invalid input");
        return ERROR;
    }
    for(i=0;i<n;i++)
    {
        p=(blink)malloc(sizeof(bnode_type));
        p->lchild=NULL;
        p->rchild=NULL;
        printf("input k:");
        scanf("%d",&k);
        p->data=k;
        if(root==NULL)
            root=p;
        else
        {
            q=root;
            while(q!=NULL)
            {
                if(q->data>k)
                {
                    if(q->lchild!=NULL)
                        q=q->lchild;
                    else
                    {
                        q->lchild=p;
                        q=NULL;
                    }
                }
                else
                {
                    if(q->rchild!=NULL)
                        q=q->rchild;
                    else
                    {
                        q->rchild=p;
                        q=NULL;
                    }
                }
            }
        } 
    }
    return OK;    
}
void preorder_1(blink root)
{
    printf("%d ",root->data);
    if(root->lchild!=NULL)
        preorder_1(root->lchild);
    if(root->rchild!=NULL)
        preorder_1(root->rchild);
}
void inorder_1(blink root)
{
    if(root->lchild!=NULL)
        inorder_1(root->lchild);
    printf("%d ",root->data);
    if(root->rchild!=NULL)
        inorder_1(root->rchild);
}
void postorder_1(blink root)
{
    if(root->lchild!=NULL)
        postorder_1(root->lchild);
    if(root->rchild!=NULL)
        postorder_1(root->rchild);
    printf("%d ",root->data);
}
void create_stack(Stack &S)
{
    S.top=0;
}
Status empty(Stack S)
{
    if(S.top==0)
        return OK;
    else
        return ERROR;
}
void push(Stack &S, blink BTN)
{
    S.data[S.top]=BTN;
    S.top++;
}
blink pop(Stack &S)
{
    S.top--;
    return(S.data[S.top]);
}
void preorder_2(blink root)
{
    blink p;
    Stack sta;
    create_stack(sta);
    p=root;
    while(p!=NULL||!empty(sta))    
    {
        if(p!=NULL)
        {
            printf("%d ",p->data);
            push(sta,p);
            p=p->lchild;
        }
        else
        {
            p=pop(sta);
            p=p->rchild;
        }
    }
}
void inorder_2(blink root)
{
    blink p;
    Stack sta;
    create_stack(sta);
    p=root;
    while(p!=NULL||!empty(sta))    
    {
        if(p!=NULL)
        {
            push(sta,p);
            p=p->lchild;
        }
        else
        {
            p=pop(sta);
            printf("%d ",p->data);
            p=p->rchild;
        }
    }    
}
void postorder_2(blink root)
{
    blink p;
    Stack sta1,sta2;
    create_stack(sta1);
    create_stack(sta2);
    if(root!=NULL)
    {
        push(sta1,root);
    }
    while(!empty(sta1))    
    {
        p=pop(sta1);
        push(sta2,p);
        if(p->lchild!=NULL)
        {
            push(sta1,p->lchild);
        }
        if(p->rchild!=NULL)
        {
            push(sta1,p->rchild);
        }
    }
    while(!empty(sta2))
    {
        p=pop(sta2);
        printf("%d ",p->data);
    }        
}
int leaves(blink root)
{
    int n=0;
    blink p;
    Stack sta;
    create_stack(sta);
    p=root;
    while(p!=NULL||!empty(sta))    
    {
        if(p!=NULL)
        {
            if(p->lchild==NULL && p->rchild==NULL)
            {
                n++;
            }
            push(sta,p);
            p=p->lchild;
        }
        else
        {
            p=pop(sta);
            p=p->rchild;
        }
    }
    return n;
}
int treelen(blink root)
{
    blink p=root;
    int n=0,l=0,r=0;
    if(p==NULL)
    {
        return 0;
    }
    if(p->lchild)
    {
        l=treelen(p->lchild);
    }
    if(p->rchild)
    {
        r=treelen(p->rchild);
    }
    n=(l>r)?l:r;
    return (n+1);
}
int nodes(blink root)
{
    int n=0;
    blink p;
    Stack sta;
    create_stack(sta);
    p=root;
    while(p!=NULL||!empty(sta))    
    {
        if(p!=NULL)
        {
            n++;
            push(sta,p);
            p=p->lchild;
        }
        else
        {
            p=pop(sta);
            p=p->rchild;
        }
    }
    return n;
}

 

 

非递归的后序遍历用了两个栈 应该还有其他的方法

 

标签:sta,上机,blink,实验,二叉树,printf,rchild,NULL,root
From: https://www.cnblogs.com/lyhthebest/p/16866717.html

相关文章

  • 617. 合并二叉树
    给你两棵二叉树: root1 和 root2 。想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。你需要将这两棵树合并成一棵新二叉树。合并的......
  • 软件工程基础Y-实验一王瑜
    (1)回顾你过去将近3年的学习经历当初你报考的时候,是真正喜欢软件工程这个专业吗?有一些喜欢至少比其它专业喜欢你现在后悔选择了这个专业吗?不后悔你认为你现在最喜欢......
  • 543. 二叉树的直径
    给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。示例:给定二叉树1......
  • 实验3 函数应用编程
    实验任务1#include<stdio.h>#include<stdlib.h>#include<time.h>#include<windows.h>#defineN80voidprint_text(intline,intcol,chartext[]);voidpri......
  • 实验2:Open vSwitch虚拟交换机实践
    实验2:OpenvSwitch虚拟交换机实践一、实验目的1.能够对OpenvSwitch进行基本操作;2.能够通过命令行终端使用OVS命令操作OpenvSwitch交换机,管理流表;3.能够通过Mininet的Pyt......
  • 实验4 类与数组、指针
    task5.cpp#include<iostream>#include"vectorInt.hpp"voidtest(){usingnamespacestd;intn;cin>>n;vectorIntx1(n);for(autoi......
  • 根据遍历序列确定二叉树
    二叉树的还原由二叉树的先序序列和中序序列,或由其后序序列和中序序列均能唯一地确定一棵二叉树。根据定义,二叉树的先序遍历是先访问根结点,其次再按先序遍历方式遍历根结......
  • 实验二:逻辑回归算法实验
    实验二:逻辑回归算法实验【实验目的】1.理解逻辑回归算法原理,掌握逻辑回归算法框架;2.理解逻辑回归的sigmoid函数;3.理解逻辑回归的损失函数;4.针对特定应用场景及数据,能......
  • 实验二:逻辑回归算法实验
    实验二:逻辑回归算法实验班级:20大数据(3)班学号:201613341【实验目的】理解逻辑回归算法原理,掌握逻辑回归算法框架;理解逻辑回归的sigmoid函数;理解逻辑回归的损失函数;......
  • 实验二:逻辑回归算法实验
    【实验目的】1.理解逻辑回归算法原理,掌握逻辑回归算法框架;2.理解逻辑回归的sigmoid函数;3.理解逻辑回归的损失函数;4.针对特定应用场景及数据,能应用逻辑回归算法解决实际分......