1. 程式人生 > >DS二叉樹--二叉樹之父子結點

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