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

题目描述

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

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

DS二叉树——二叉树之父子结点_第1张图片

输入

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

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

输出

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

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

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

 

输入样例1 

3
AB0C00D00
AB00C00
ABCD0000EF000
 

输出样例1

C D \n
B A \n
B C \n
A A \n
D F \n
C E \n

#include
#include
using namespace std;

class BiNode {
public:
	char data;
	BiNode* lchild, * rchild;
	BiNode* parent;
	BiNode() :lchild(NULL), rchild(NULL), parent(NULL) {}//无参构造初始化
	BiNode(char c) :data(c), lchild(NULL), rchild(NULL), parent(NULL) {}//有参构造
	friend class BiTree;
};

class BiTree {
	BiNode* root;
	queue leaf;//两个队列,存储用于输出的数据
	queue parent;
	void CreateTree(BiNode*& t, BiNode* p) {//记录当前节点和当前结点的双亲,t为指针变量引用,不改变原来的值。
		char c;
		cin >> c;//每进来一次都判断一次
		if (c != '0') {
			t = new BiNode(c);
			t->parent = p;
			CreateTree(t->lchild, t);//从t之后找左子树并建立
			CreateTree(t->rchild, t);//找右子树并建立
		}
		else {
			t = NULL;
		}
	}
	void PreOrder(BiNode* t) {//前序遍历,如果不存在左子树和右子树,就压入(前序是先操作,再左右)
		if (t)
		{
			if (!t->lchild && !t->rchild)
			{
				leaf.push(t);
				parent.push(t->parent);
			}
			PreOrder(t->lchild);
			PreOrder(t->rchild);
		}
	}
public:
	BiTree() :root(NULL) {}
	void CreateTree() {//建树从根开始
		CreateTree(root, NULL);
	}
	void PreOrder() {
		PreOrder(root);//从根开始
		while (!leaf.empty()) {//输出叶子
			cout << leaf.front()->data << " ";
			leaf.pop();
		}
		cout << endl;
		while (!parent.empty()) {//输出双亲
			cout << parent.front()->data << " ";
			parent.pop();
		}
		cout << endl;
	}
};

int main() {
	int t;
	cin >> t;
	while (t--) {
		BiTree mytree;
		mytree.CreateTree();
		mytree.PreOrder();
	}
	return 0;
}

你可能感兴趣的:(算法,数据结构)