DS二叉树--二叉树之父子结点

Posted liu269393

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DS二叉树--二叉树之父子结点相关的知识,希望对你有一定的参考价值。

题目描述

给定一颗二叉树的逻辑结构如下图,(先序遍历的结果,空树用字符‘0’表示,例如AB0C00D00),建立该二叉树的二叉链式存储结构。

编写程序输出该树的所有叶子结点和它们的父亲结点

技术分享图片

输入

第一行输入一个整数t,表示有t个二叉树

第二行起,按照题目表示的输入方法,输入每个二叉树的先序遍历,连续输入t行

输出

第一行按先序遍历,输出第1个示例的叶子节点

第二行输出第1个示例中与叶子相对应的父亲节点

以此类推输出其它示例的结果

 

样例输入

3
AB0C00D00
AB00C00
ABCD0000EF000

样例输出

C D
B A
B C
A A
D F
C E
 
在递归遍历的时候传入父节点的data,若判断为叶子节点则将该data入队
#include<iostream>
#include<queue>
#include<string>
using namespace std;
class BitreeNode
{
public:
    char data;
    BitreeNode *left;
    BitreeNode *right;
    BitreeNode() :left(NULL), right(NULL) {}
    ~BitreeNode() {}
};
class Bitree
{
private:
    BitreeNode *Root;
    int pos;
    string strtree;
    BitreeNode *CreateBitree();
    void countleaves(BitreeNode *t,char fatherdata);
public:
    queue<char> q;
    Bitree() {};
    ~Bitree() {};
    void CreateTree(string TreeArray);
    void countleaves();
};
void Bitree::CreateTree(string treearray)
{
    pos = 0;
    strtree.assign(treearray);
    Root = CreateBitree();
}
BitreeNode *Bitree::CreateBitree()
{
    BitreeNode *T;
    char ch;
    ch = strtree[pos++];
    if (ch == 0)
        T = NULL;
    else
    {
        T = new BitreeNode();
        T->data = ch;
        T->left = CreateBitree();
        T->right = CreateBitree();
    }
    return T;
}
void Bitree::countleaves()
{
    pos = 0;
    countleaves(Root,Root->data);
    cout << endl;
    while (!q.empty())
    {
        cout << q.front()<<" ";
        q.pop();
    }
    cout << endl;
}
void Bitree::countleaves(BitreeNode *t,char fatherdata)
{
    if (t)
    {
        if (!t->left && !t->right)
        {                
            cout << t->data << " ";
            q.push(fatherdata);
        }
        countleaves(t->left,t->data);
        countleaves(t->right,t->data);
        
    }
}
int main()
{
    int t;
    cin >> t;
    while (t--)
    {
        string str;
        cin >> str;
        Bitree *tree;
        tree = new Bitree();
        tree->CreateTree(str);
        tree->countleaves();
    }
}

 

以上是关于DS二叉树--二叉树之父子结点的主要内容,如果未能解决你的问题,请参考以下文章

数据结构 二叉树

DS二叉树——二叉树之数组存储

DS二叉树——二叉树之数组存储

DS树--二叉树之最大路径

DS | 二叉树之非递归遍历

DS树+图综合练习--二叉树之最大路径