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();
    }
}

原文地址:https://www.cnblogs.com/Liu269393/p/10217572.html

时间: 2025-01-13 09:38:53

DS二叉树--二叉树之父子结点的相关文章

《剑指offer》:[58]二叉树的下一个结点

题目:给定一棵二叉树和其中一个结点,如何找出中序遍历顺序的下一个结点?树中的结点除了有两个分别指向左右子结点的指针外,还有一个指向父节点的指针. 分析:这里已经说了是中序遍历,所以我们就以中序遍历为例.由于是二叉树,所以有三种情况: (1)如果如果一个结点有右子树,那么它的下一个结点就是它的右子树中最左子节点.也就是说从右子节点出发一直沿着指向左子结点的指针,我们就能找到它的 下一个结点. (2)如果这个结点没有右子树,如果结点是它父节点的左子树,则它的下一个结点就是它的父节点. (3)如果一个

二叉树的下一个结点-剑指Offer

二叉树的下一个结点 题目描述 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. 思路 当该结点有右子树时,下一个结点就是右子树中最左的那个结点 当该结点没有右子树,而且是父节点的左子树,那下一个结点就是父节点 当该结点没有右子树,而且是父节点的右子树,那就向上寻找直到是某个父节点的左子树,然后改父节点就是下一个结点,如果找到根节点还没有找到满足条件的父节点,那就是没有下一个结点 代码 /* public cla

二叉树中两个结点最近的公共祖先汇总

一.若二叉树为搜索二叉树 原题链接:https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-search-tree/#/description Given a binary search tree (BST), find the lowest common ancestor (LCA) of two given nodes in the BST. According to the definition of LCA on

面试题8:二叉树的下一个结点

// 面试题8:二叉树的下一个结点 // 题目:给定一棵二叉树和其中的一个结点,如何找出中序遍历顺序的下一个结点? // 树中的结点除了有两个分别指向左右子结点的指针以外,还有一个指向父结点的指针. // 二叉树的结构体定义如下. struct BinaryTreeNode { int m_nValue; BinaryTreeNode* m_pLeft; BinaryTreeNode* m_pRight; BinaryTreeNode* m_pParent; }; 解题思路: 以上图为例,节点有

【Java】 剑指offer(7) 二叉树的下一个结点

本文参考自<剑指offer>一书,代码采用Java语言. 题目 给定一棵二叉树和其中的一个结点,如何找出中序遍历顺序的下一个结点? 树中的结点除了有两个分别指向左右子结点的指针以外,还有一个指向父结点的指针. 思路 首先自己在草稿纸上画图,进行分析(不再展开).可以发现下一个结点的规律为: 1.若当前结点有右子树时,其下一个结点为右子树中最左子结点: 2.若当前结点无右子树时, (1)若当前结点为其父结点的左子结点时,其下一个结点为其父结点: (2)若当前结点为其父结点的右子结点时,继续向上遍

【剑指offer】面试题 8. 二叉树的下一个结点

面试题 8. 二叉树的下一个结点 NowCoder 题目描述 给定一棵二叉树和其中的一个结点,如何找出中序遍历顺序的下一个结点?树中的结点除了有两个分别指向左右子结点的指针以外,还有一个指向父结点的指针. Java 实现 略 原文地址:https://www.cnblogs.com/hglibin/p/10930092.html

javascript实现数据结构: 树和二叉树,二叉树的遍历和基本操作

树型结构是一类非常重要的非线性结构.直观地,树型结构是以分支关系定义的层次结构. 树在计算机领域中也有着广泛的应用,例如在编译程序中,用树来表示源程序的语法结构:在数据库系统中,可用树来组织信息:在分析算法的行为时,可用树来描述其执行过程等等. 下面讲解的内容完整代码在这:https://github.com/LukeLin/data-structure-with-js/blob/master/Binary%20tree/BinaryTree.js 首先看看树的一些概念: 1.树(Tree)是n

二叉树 二叉树的性质 存储结构 遍历二叉树 C实现二叉树的创建和遍历 线索二叉树

定义 二叉树(binary tree)是n(n>=0)个结点的有限集合,该集合为空集合称为空二叉树,或者有一个根结点和两棵互不相交的,分别称为树根结点的左孩子树和右孩子树组成. 二叉树的特点 每个结点最多有两棵子树,所以二叉树总没有度大于2的结点 左子树和右子树是有顺序的,次数不能任意颠倒 即使树中某结点只有一棵子树,也要区分是左子树还是右子树 特殊的二叉树 1. 斜树 所有的结点都只有左子树的二叉树称为左斜树; 所有的结点都只有右子树的二叉树称为右斜树; 这两者统称为斜树 2. 满二叉树 在一

DS二叉树—二叉树结点的最大距离

题目描述 二叉树两个结点的距离是一个结点经过双亲结点,祖先结点等中间结点到达另一个结点经过的分支数.二叉树结点的最大距离是所有结点间距离的最大值.例如,下图所示二叉树结点最大距离是3,C和D的距离. 二叉树用先序遍历顺序创建,#表示空树.计算二叉树结点最大距离和最大距离的两个结点(假设二叉树中取最大距离的两个结点唯一). 输入 测试次数T 第2行之后的T行,每行为一棵二叉树先序遍历结果(#表示空树) 输出 对每棵二叉树,输出树的结点最大距离和最大距离的结点,输出格式见样例. 样例输入 3 A##