二叉树按层建立以及先序中序后序遍历

二叉树遍历

时间限制(普通/Java):1000MS/3000MS     内存限制:65536KByte

描述

给定一颗二叉树,要求输出遍历该二叉树得到的先序、中序、后序遍历序列。

输入

输入数据分为多组,第一行是测试数据的组数n,下面的n行分别代表一棵二叉树。每棵二叉树的结点均为正整数,数据为0代表当前结点为空,数据为-1代表二叉树数据输入结束,-1不作处理。二叉树的构造按照层次顺序(即第1层1个整数,第2层2个,第3层4个,第4层有8个......,如果某个结点不存在以0代替,总共不超过100)

输出

输出每棵二叉树的先序、中序、后序遍历序列,每个序列占一行。

样例输入

2
1 -1
1 2 3 4 5 0 6 -1

样例输出

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

提示

输出的每个节点值前有一个空格。

 思路:用了结构体指针的方法按层建立二叉树,中间变换时建立一个队列来维护二叉树左右支建立。按层将每个数据依次存入队列,当左右子节点都不为NULL时将指针跳向下一个队列中的值。

code:

#include<bits/stdc++.h>
using namespace std;
const int N = 1e3 + 5;
typedef long long ll;
string s;
struct tree{
    tree* left, * right;int val;
};
struct LinkNode {
    tree* p; // 树中对应结点的地址
    LinkNode* pNext;
};
int flag;
bool InitTree(tree *&T) {
    T = NULL;
    return true;
}

void createtree(tree* &T, LinkNode*& phead, LinkNode*& ptail, int val) {
   
    tree* pTreeNew = (tree*)calloc(1, sizeof(tree)); // calloc为树结点申请空间初始化为0
    LinkNode* pQueueNew = (LinkNode*)calloc(1, sizeof(LinkNode)); // calloc为队列结点申请空间初始化为0
    LinkNode* pCur = phead;//始终指向当前操作位置

    pTreeNew->val = val;     //树节点赋值
    pQueueNew->p = pTreeNew;  //队列新节点即树新节点
    
    if (T == NULL) { // 空树时,新结点置为树根
        T = pTreeNew;
        phead = pQueueNew;
        ptail = pQueueNew;
    }
    else {
        ptail->pNext = pQueueNew; //尾插法
        ptail = pQueueNew;        // 更新尾指针

        if (pCur->p->left == NULL) { // 左孩子为空
            pCur->p->left = pTreeNew;
        }
        else if (pCur->p->right == NULL) { //右孩子为空
            pCur->p->right = pTreeNew;
            phead = pCur->pNext; 
            free(pCur);
            pCur = NULL;
        }
    }
}
void find1(tree *x)
{
    if (x == NULL||x->val==0)
        return;
    cout << " " << x -> val;
    find1(x->left);
    find1(x->right);
}
void find2(tree* x)
{
    if (x == NULL || x->val == 0)
        return;

    find2(x->left);
    cout << " " << x->val;
    find2(x->right);
}
void find3(tree* x)
{
    if (x == NULL || x->val == 0)
        return;
    find3(x->left);
    find3(x->right);
    cout << " " << x->val;
}
int main()
{
    int n;
    cin >> n;
    while (n--)
    {
        flag = 0;
        tree* t;
        InitTree(t);

        LinkNode* phead = NULL;
        LinkNode* ptail = NULL; 
        int x;
        while (cin >> x, x != -1)
        {
            createtree(t,phead,ptail,x);
        }
        find1(t); cout << "\n";
        find2(t); cout << "\n";
        find3(t); cout << "\n";
    }
    return 0;
}

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值