DS二叉樹的先序遍歷及應用
阿新 • • 發佈:2021-01-02
技術標籤:Data Structure
題目
問題 C: DS二叉樹的先序遍歷及應用
時間限制: 1 Sec 記憶體限制: 128 MB
提交: 74 解決: 32
[提交][狀態][討論版]
題目描述
按先序遍歷給出一棵二叉樹,每個結點都有一個水平位置:左子結點在它左邊一個單位,右子結點在右邊1個單位。從左向右輸出每個水平位置的所有節點的權值之和。
例如:以下二叉樹有三個水平位置,從左至右的輸出是7,11,3。
輸入
測試資料有多組,每組測試資料輸入按先序遍歷輸入一棵二叉樹,其中-1代表空節點(一棵樹的節點數量不超過 103)
當輸入的二叉樹是一棵空樹時,結束輸入。
輸出
對於每組測試資料,首先輸出一行"Case x:" ,其中x代表這是第x個測試資料的輸出,然後從左到右輸出每個水平位置所有節點的權值之和
樣例輸入
5 7 -1 6 -1 -1 3 -1 -1
8 2 9 -1 -1 6 5 -1 -1 12 -1
-1 3 7 -1 -1 -1
-1
樣例輸出
Case 1:
7 11 3
Case 2:
9 7 21 15
程式碼塊
#include <iostream>
using namespace std;
class BiTNode
{
int data;
BiTNode *lchild, *rchild;
friend class BiTree;
} ;
class BiTree
{
BiTNode *root;
int *count;
int max, min;
void PreOrderTraverse(BiTNode *&p);
void InOrderTraverse(BiTNode *p, int num);
public:
BiTree();
~BiTree();
int PreOrder();
void InOrder();
void Clear();
};
BiTree::BiTree()
{
max = 1000;
min = 1000;
root = NULL;
count = new int[2000];
for(int i=0; i<2000; i++)
count[i] = 0;
}
BiTree::~BiTree()
{
delete []count;
}
int BiTree::PreOrder()
{
PreOrderTraverse(root);
if(root)
return 1;
else
return 0;
}
void BiTree::PreOrderTraverse(BiTNode *&p)
{
int temp;
cin>>temp;
if(temp!=-1)
{
p = new BiTNode;
p->data = temp;
PreOrderTraverse(p->lchild);
PreOrderTraverse(p->rchild);
}
else
p = NULL;
}
void BiTree::InOrder()
{
InOrderTraverse(root, 1000);
for(int i=min; i<=max; i++)
{
if(i!=max)
cout<<count[i]<<' ';
else
cout<<count[i]<<endl;
}
}
void BiTree::InOrderTraverse(BiTNode *p, int num)
{
if(p)
{
InOrderTraverse(p->lchild, num-1);
count[num] += p->data;
if(num>max)
max = num;
if(num<min)
min = num;
InOrderTraverse(p->rchild, num+1);
}
}
void BiTree::Clear()
{
root = NULL;
max = 1000;
min = 1000;
for(int i=0; i<2000; i++)
count[i] = 0;
}
int main(void)
{
BiTree myTree;
int num = 1;
while(myTree.PreOrder())
{
cout<<"Case "<<num<<':'<<endl;
num++;
myTree.InOrder();
myTree.Clear();
cout<<endl;
}
return 0;
}