打印输出二叉树中叶子的结点
发布日期:2021-05-07 17:58:52 浏览次数:18 分类:精选文章

本文共 1871 字,大约阅读时间需要 6 分钟。

问题描述:采用先序法建立一棵二叉树,并设计按先序输出二叉树的叶子结点。二叉树的数据域类型为字符型,扩展二叉树的叶子结点用“#”表示。要求可以输出多棵二叉树的叶子结点,当二叉树为空时程序结束。

输入描述:循环输入多棵扩展二叉树的先序遍历序列,每棵树占一行,以回车结束。每棵二叉树中结点之间以空格隔开。

输出描述:输出各二叉树中的叶子结点,每次输出后换行。当二叉树为空时,输出“NULL”,程序结束。

输入样例:A B # # C D # E # F # # G H # I K # # # #A B D H # # I # # E J # # K # # C F L # # M # # O #

输出样例:B F KH I J K L M N ONULL

问题分析:要输出叶子结点,需要计算结点的左右子树是否同时为空。如果是,则输出该结点的数据域。

代码实现:

#include 
#include
using namespace std;struct Node { char data; Node* Lchild; Node* Rchild;};class Text {public: Text() { root = new Node(); } ~Text() { delete root; } void preOrderTraversal() { preOrder(root); } void judgeLeafNodes() { judge(root); }private: Node* root; static int count = 0; Node* createNode() { char ch; cin >> ch; if (ch == '#') { return new Node(); } else { return new Node(); } } void releaseNode(Node* node) { if (node == nullptr) return; releaseNode(node->Lchild); releaseNode(node->Rchild); delete node; } void preOrder(Node* node) { if (node == nullptr) return; if (node->Lchild == nullptr && node->Rchild == nullptr) { cout << node->data << " "; return; } preOrder(node->Lchild); preOrder(node->Rchild); } void judge(Node* node) { if (node == nullptr) { cout << "NULL" << endl; return; } if (node->Lchild == nullptr && node->Rchild == nullptr) { return; } judge(node->Lchild); judge(node->Rchild); }};int main() { while (true) { Text text; text.judgeLeafNodes(); text.preOrderTraversal(); cout << endl; if (cin >> ws && !cin) break; } return 0;}

注:以上代码实现了对多棵二叉树的处理,每棵树的输入占一行。程序通过先序遍历判断每个结点是否为叶子结点,并输出符合条件的叶子结点。输入结束时输出“NULL”并结束程序。

上一篇:二叉树的基本操作
下一篇:求二叉树的深度

发表评论

最新留言

逛到本站,mark一下
[***.202.152.39]2025年04月02日 04时42分36秒