求解二叉树

这篇博客介绍了如何通过已知的中序遍历和前序遍历序列来构建二叉树。给出了两种情况:一是已知中序和前序序列,二是已知中序和后序序列。代码实现分别展示了这两种情况下的递归构造过程,并提供了层次遍历的输出方法。
摘要由CSDN通过智能技术生成

二叉树的三种遍历方式:

在这里插入图片描述

1.先序遍历:按照根节点->左子树->右子树的顺序访问二叉树

A B D H E I C F J K G

2.中序遍历:按照左子树->根节点->右子树的顺序访问

D H B E I A J F K C G

3.后序遍历:按照左子树->右子树–>根节点的顺序访问

H D I E B J K F G C A

求解二叉树

1.已知:中序遍历序列、前序遍历序列

1 2 3 4 5 6 7
4 1 3 2 6 5 7

#include<bits/stdc++.h>
using namespace std;
struct ss{
    ss *Left;
    ss *Right;
    int data;
};
int n, a[50], b[50], h;
ss *dss(int a[], int b[], int n){
    if(n <= 0) 
        return NULL;
    ss *T = new ss();
    int root = a[0]; //找到根节点
    int k = -1;
    T->data = root; //创建树的节点
    for(int i = 0; i < n; i ++){ //由于中序遍历使两边分开
        if(b[i] == root){
            k = i;
            break;
        }
    }
    T->Left = dss(a+1,b,k);
    T->Right = dss(a+k+1,b+k+1,n-(k+1));
    return T;
}
void p(ss *T){
    cout << T->data << " ";
    if(T->Left != NULL)
        p(T->Left);
    if(T->Right != NULL)
        p(T->Right);
}
int main()
{
	cin >> n;
    for(int i = 0; i < n; i ++){ // 前
        cin >> a[i];
    }
    for(int i = 0; i < n; i ++){ // 中
        cin >> b[i];
    }
    ss *T = dss(a,b,n);
    p(T);
	return 0;
}
2.已知:中序遍历序列、后序遍历序列

1 2 3 4 5 6 7
2 3 1 5 7 6 4

#include<bits/stdc++.h>
using namespace std;
struct ss{
    ss *Left;
    ss *Right;
    int data;
};
int n, a[50], b[50], h;
ss *dss(int a[], int b[], int n){
    if(n <= 0) 
        return NULL;
    ss *T = new ss();
    int root = a[n-1]; //找到根节点
    int k = -1;
    T->data = root; //创建树的节点
    for(int i = 0; i < n; i ++){ //由于中序遍历使两边分开
        if(b[i] == root){
            k = i;
            break;
        }
    }
    T->Left = dss(a,b,k);
    T->Right = dss(a+k,b+k+1,n-(k+1));
    return T;
}
void p(ss *T){
    cout << T->data << " ";
    if(T->Left != NULL)
        p(T->Left);
    if(T->Right != NULL)
        p(T->Right);
}
int main()
{
	cin >> n;
    for(int i = 0; i < n; i ++){ // 后
        cin >> a[i];
    }
    for(int i = 0; i < n; i ++){ // 中
        cin >> b[i];
    }
    ss *T = dss(a,b,n);
    p(T);
	return 0;
}
1、2对比:
// 已知中前
int root = a[0]; // 找到根节点
T->Left = dss(a+1,b,k); // 左遍历
T->Right = dss(a+k+1,b+k+1,n-(k+1)); // 右遍历
// 已知中后
int root = a[n-1]; // 找到根节点
T->Left = dss(a,b,k); // 左遍历
T->Right = dss(a+k,b+k+1,n-(k+1)); // 右遍历
层次遍历:
void print(ss *T)//层次遍历输出二叉树
{
  ss *p;//为中间变量
  ss *pr[100];
  int rear = -1, front = -1, num = 0;
  rear ++;
  pr[rear] = T;//将根节点放入到队列之中
  while(rear != front){
      front ++;
      p = pr[front]; //用来读取数据
      cout << p->data;
      num ++; //用来控制空格的输出,最后一位不用空格
      if(num < n)
         cout<<" ";
      if(p->Left){
          rear ++;
          pr[rear] = p->Left;
      }
       if(p->Right){
          rear ++;
          pr[rear] = p->Right;
      }
  }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值