1. 程式人生 > 其它 >DS二叉樹的先序遍歷及應用

DS二叉樹的先序遍歷及應用

技術標籤: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; }