1. 程式人生 > >輸出利用二叉樹儲存的普通樹的度

輸出利用二叉樹儲存的普通樹的度

普通樹可轉換成相應的二叉樹(該二叉樹的根結點一定缺少右兒子),反之亦然。故而可以根據相應的轉換方法去統計某一二叉樹對應的普通樹的度。普通樹的度為其結點兒子數的最大值。相應的二叉樹可利用二叉樹的先序遞迴遍歷演算法建立。先序遞迴遍歷建立二叉樹的方法為:按照先序遞迴遍歷的思想將對二叉樹結點的抽象訪問具體化為根據接收的資料決定是否產生該結點從而實現建立該二叉樹的二叉連結串列儲存結構。約定二叉樹結點資料為單個大寫英文字元。當接收的資料是字元"#"時表示該結點不需要建立,否則建立該結點。最後再統計該二叉樹對應的森林中樹的棵數。需要注意輸入資料序列中的"#"字元的序列及個數關係,這會最終決定建立的二叉樹的形態(序列裡面允許無效字元但需要正確處理)。

輸入

輸入為接受鍵盤輸入的由大寫英文字元和"#"字元構成的一個字串(用於建立對應的二叉樹)。

輸出

若表示的二叉樹對應普通樹,則該普通樹的度;否則輸出ERROR。

樣例輸入

AB#CD##E###
ABC####
AB##C##
ABCD###EF##G###
A##B##

樣例輸出

3
1
ERROR
3
1
提 交gcc11
#include<iostream>
using namespace std;
struct node
{
	char date;
	node *left, *right;
}*p;

void set(node *&p)
{
	char ch;
	cin >> ch;
	if (ch == '#')
	{
		p = NULL;
	}
	else
	{
		p = new node;
		p->date = ch;
		set(p->left);
		set(p->right);
	}
}

int m;
void find(node *&p,int k)
{
	if (p == NULL)
		return;
	if (m < k)
	{
		m = k;
	}
	find(p->left, 0);
	find(p->right, k + 1);
}

int main()
{
	set(p);
	m = 0;
	if (p->right != NULL)
	{
		cout << "ERROR";
	}
	else
	{
		find(p, 0);
		cout << m + 1;
	}
	return 0;
}