二叉树的相关操作(各种遍历,叶子节点数,深度,完全二叉树,相等树,创建)

这段代码实现了二叉树的各种操作,包括使用栈和队列进行前序、中序、后序遍历,非递归遍历,计算叶子节点数量,计算树的深度,判断是否为完全二叉树,交换左右子树等功能。同时,还提供了输入数据构建二叉树,层次遍历和比较两棵树是否相等的实现。
摘要由CSDN通过智能技术生成

栈的相关操作

typedef struct stack  {
    bitree *data;
    int front, top;
}sta;
void init_stack(sta *q) {
   q->data = new bitree [100];
   q->front =q->top = 0;
}
void push(sta* q, bitree c) {
    q->data[q->top]= c;
    q->top++;
}
void pop(sta* q) {
    q->top--;
} 
bool empty(sta *q) {
    if (q->front == q->top)
        return 1;
    else
        return 0;
}
bitree gettop(sta *q) {
    return q->data[q->top-1];
}

队列的相关操作

typedef struct queue {
     bitree * data;
     int front, rear;
 }que, *sque;
 void init_que(sque s) {
     s->data = new bitree[100];
     s->front = s->rear = 0;
 }
 void que_push(sque s,bitree q) {
     s->data[s->rear++]=q;
 }
 void que_pop(sque s) {
     s->front++;
 }
 bitree que_gettop(sque s) {
     return s->data[s->front];
 }
 bool que_empty(sque s) {
     if (s->front == s->rear)
         return 1;
     else
         return 0;
 }

二叉树的建立

typedef struct BiTREE* bitree;
void init(bitree* p) {
    int a;
    cin >> a;
    if (a == -1) {
        *p = NULL;
    }
    else {
        (*p) = new struct BiTREE[1];
        (*p)->data = a;
        (*p)->lc = NULL;
        (*p)->rc = NULL;
        init(&(*p)->lc);
        init(&(*p)->rc);
        flag = 1;
    }
}

递归遍历

void preview(bitree s) {//前序
    if (s) {
        cout << s->data<<" ";
        preview(s->lc);
        preview(s->rc);
    }
}
void inview(bitree s) {//中序
    if (s) {
        inview(s->lc);
        cout << s->data<<" ";
        inview(s->rc);
    }
}
 void postview(bitree s) {后序
     if (s) 
         {
             postview(s->lc);
             postview(s->rc);
             cout << s->data << " ";
         }
}

非递归

 void INpreview(bitree s) {//非递归前序
     sta a;
     init_stack(&a);
     bitree q;
     q = s;
     while (!empty(&a)||q) {
         if (q) {
             push(&a, q);
             cout << q->data<<" ";
             q = q->lc;
         }
         else {
             q=gettop(&a);
             q = q->rc;
             pop(&a);
         }
     }
 }
 void INinview(bitree s) {//非递归中序
     sta a;
     init_stack(&a);
     bitree q;
     q = s;
     while (!empty(&a) || q) {
         if (q) {
             push(&a, q);
             q = q->lc;
         }
         else {
            q= gettop(&a);
             cout << q->data << " ";
             q = q->rc;
             pop(&a);
         }
     }
 }
 void INpostview(bitree s) {//非递归后序
     sta a;
     init_stack(&a);
     bitree q;
     bitree pre=NULL,top;
     q = s;
     while (!empty(&a)||q) {
         while(q) {
             push(&a, q);
             q = q->lc;
         }
         top= gettop(&a);
          if (!top->rc||top->rc==pre) {
              cout <<top->data << " ";
              pop(&a);
              pre = top;
         }
         else {
             q = top->rc;
         }
     }
 }

叶子节点数

int leafnode(bitree s) {
     if (!s)
         return 0;
     else if (!s->lc && !s->rc)
         return 1;
     else
         return leafnode(s->lc) + leafnode(s->rc);  
 }

深度

int depthtree(bitree s) {
     if (!s)
        return 0;
       else if(!s->lc&&!s->rc)
       return 1;
       else{
       deplc = depthtree(s->lc);
       deprc = depthtree(s->rc);
       }
     if (deplc > deprc)
         return deplc + 1;
     else
         return deprc + 1;
 }

相等

 bool sametree(bitree s, bitree d) {
       if (!s && !d)
         return 1;
        else if(!s||!d)
            return 0;
        else if (s->data == d->data) 
            return sametree(s->lc, d->lc) && sametree(s->rc, d->rc);
         else {
             return 0;
     }
  }

判断是否为完全二叉树

bool judge(bitree s) {//与层次遍历的代码基本相似
     if (s) {
         que a;
         bitree q;
         q = s;
         init_que(&a);
         que_push(&a, q);
         while (!que_empty(&a)) {
             q = que_gettop(&a);
             que_pop(&a);
             if (!q)
                 break;
             que_push(&a, q->lc);
             que_push(&a, q->rc);
         }
         while (!que_empty(&a)) {
             q = que_gettop(&a);
             if (q)
                 return 0;
             que_pop(&a);
         }
         return 1;
     }
 }

交换左右子树

void swap(bitree s) {
     if (s) {
         bitree temp;
         temp= s->lc;
         s->lc= s->rc;
         s->rc = temp;
         swap(s->lc);
         swap(s->rc);
     }
 }

完整代码

#include <iostream>
#include <cstdio>
using namespace std;
typedef struct BiTREE* bitree;
int flag = 0;
int deplc, deprc;
//栈的相关操作
typedef struct stack  {
    bitree *data;//存放结点的地址便于回退
    int front, top;
}sta;
void init_stack(sta *q) {//初始化栈
   q->data = new bitree [100];
   q->front =q->top = 0;
}
void push(sta* q, bitree c) {将结点地址压入站
    q->data[q->top]= c;
    q->top++;
}
void pop(sta* q) {
    q->top--;//出栈操作
} 
bool empty(sta *q) {//判断是否为空
    if (q->front == q->top)
        return 1;
    else
        return 0;
}
bitree gettop(sta *q) {//取栈顶元素
    return q->data[q->top-1];
}
//以上区间的函数是栈的相关操作
 typedef struct BiTREE
{
    int data;
    bitree lc, rc;
}bit;
//队列的相关操作
 typedef struct queue {
    bitree * data;//存放结点的地址便于回退
     int front, rear;
 }que, *sque;
 void init_que(sque s) {//初始化队列
     s->data = new bitree[100];
     s->front = s->rear = 0;
 }
 void que_push(sque s,bitree q) {
     s->data[s->rear++]=q;
 }//将结点地址压入队列
 void que_pop(sque s) {
     s->front++;
 }//压出数据
 bitree que_gettop(sque s) {
     return s->data[s->front];
 }//取栈顶元素
 bool que_empty(sque s) {//判断是否为空
     if (s->front == s->rear)
         return 1;
     else
         return 0;
 }
 //以上区间的函数是队列的相关操作
 void level_view(bitree s) {
     if (s) {
         que a;
         init_que(&a);
         bitree q,top;
         q = s;
         que_push(&a, q);
         while (!que_empty(&a)) {
             q = que_gettop(&a);
             cout << q->data<<" ";
             que_pop(&a);
             if (q->lc)
                 que_push(&a, q->lc);
             if (q->rc)
                 que_push(&a, q->rc);
         }
     }
 }
void init(bitree* p) {//二级指针,在函数中为一个指针分配内存空间能用引用和二级指针或返回根结点的地址
    int a;
    cin >> a;
    if (a == -1) {
        *p = NULL;
    }
    else {
        (*p) = new struct BiTREE[1];
        (*p)->data = a;
        (*p)->lc = NULL;
        (*p)->rc = NULL;
        init(&(*p)->lc);
        init(&(*p)->rc);
        flag = 1;
    }
}

void preview(bitree s) {
    if (s) {
        cout << s->data<<" ";
        preview(s->lc);
        preview(s->rc);
    }
}
void inview(bitree s) {
    if (s) {
        inview(s->lc);
        cout << s->data<<" ";
        inview(s->rc);
    }
}
 void postview(bitree s) {
     if (s) 
         {
             postview(s->lc);
             postview(s->rc);
             cout << s->data << " ";
         }
}
 void INpreview(bitree s) {
     sta a;
     init_stack(&a);
     bitree q;
     q = s;
     while (!empty(&a)||q) {
         if (q) {
             push(&a, q);
             cout << q->data<<" ";
             q = q->lc;
         }
         else {
             q=gettop(&a);
             q = q->rc;
             pop(&a);
         }
     }
 }
 void INinview(bitree s) {
     sta a;
     init_stack(&a);
     bitree q;
     q = s;
     while (!empty(&a) || q) {
         if (q) {
             push(&a, q);
             q = q->lc;
         }
         else {
            q= gettop(&a);
             cout << q->data << " ";
             q = q->rc;
             pop(&a);
         }
     }
 }
 void INpostview(bitree s) {
     sta a;
     init_stack(&a);
     bitree q;
     bitree pre=NULL,top;
     q = s;
     while (!empty(&a)||q) {
         while(q) {
             push(&a, q);
             q = q->lc;
         }
         top= gettop(&a);
          if (!top->rc||top->rc==pre) {
              cout <<top->data << " ";
              pop(&a);
              pre = top;
         }
         else {
             q = top->rc;
         }
     }
 }
 int leafnode(bitree s) {
     if (!s)
         return 0;
     else if (!s->lc && !s->rc)
         return 1;
     else
         return leafnode(s->lc) + leafnode(s->rc);  
 }
 int depthtree(bitree s) {
     if (!s)
        return 0;
       deplc = depthtree(s->lc);
       deprc = depthtree(s->rc);
     if (deplc > deprc)
         return deplc + 1;
     else
         return deprc + 1;
 }
 bool sametree(bitree s, bitree d) {
       if (!s && !d)
         return 1;
        else if(!s||!d)
            return 0;
        else if (s->data == d->data) 
            return sametree(s->lc, d->lc) && sametree(s->rc, d->rc);
         else {
             return 0;
     }
  }
 bool judge(bitree s) {
     if (s) {
         que a;
         bitree q;
         q = s;
         init_que(&a);
         que_push(&a, q);
         while (!que_empty(&a)) {
             q = que_gettop(&a);
             que_pop(&a);
             if (!q)
                 break;
             que_push(&a, q->lc);
             que_push(&a, q->rc);
         }
         while (!que_empty(&a)) {
             q = que_gettop(&a);
             if (q)
                 return 0;
             que_pop(&a);
         }
         return 1;
     }
 }
 void swap(bitree s) {
     if (s) {
         bitree temp;
         temp= s->lc;
         s->lc= s->rc;
         s->rc = temp;
         swap(s->lc);
         swap(s->rc);
     }
 }
int main()
{
    int N;
    cout << "输入第一个二叉树数据" << endl;
    bitree b;
    init(&b);
    bitree d;
    init(&d);
    if (flag)
        cout << "成功创建"<<endl;
    else
        cout << "创建失败";
    cout << "前序遍历" << endl;
    preview(b);
    cout << endl;
    cout << "中序" << endl;
    inview(b);
    cout << endl;
    cout << "后序" << endl;
    postview(b);
    cout << endl<< "非递归前序遍历"<< endl;
    INpreview(b);
    cout << endl;
    cout << "非递归中序" << endl;
    INinview(b);
    cout << endl;
    cout << "非递归后序" << endl;
    INpostview(b);
    int c = 0;
   c= leafnode(b);
   cout << endl<<"叶子节点数" << endl;
   cout << c;
    int c = 0;
   c= depthtree(b);
   cout << endl << "该树的深度" << endl;
   cout << c;
   if (sametree(b, d)) {
       cout << "两个树相似" << endl;
   }
   else
       cout <<endl<< "两个树不相似" << endl;
   cout << endl << "变换前非递归前序遍历" << endl;
   INpreview(b);
   cout << endl;
   swap(b);
   cout << endl << "变换后非递归前序遍历" << endl;
   INpreview(b);
   cout << endl;
    cout << "层次遍历" << endl;
    level_view(b);
    if (judge(b)) {
        cout << "是完全二叉树" << endl;
    }
    else {
        cout << "不是完全二叉树" << endl;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值