數據結構實訓(三)--- 求二叉樹中值為x的結點的層號


【問題描述】
以二叉鏈表為存儲結構,編寫算法求二叉樹中值為x的結點的層號。

【輸入形式】兩行,第一行是擴展二叉樹的前序遍歷序列,第二行是待查詢結點x
【輸出形式】值為x的結點所在層號。根結點所在層記為第1層。
【樣例輸入】AB#D##C##
D
【樣例輸出】
3

main.cpp文件

#include <iostream>
#include "BiTree.h"
using namespace std; // 可以不寫

int main()
{
    BiTree<char> t;
    char ch;
    cin >> ch;
    cout << t.XLay(ch);
}

 

BiTree.h文件(綜合上幾題的二叉樹方法)

#ifndef BITREE_H_INCLUDED
#define BITREE_H_INCLUDED using namespace std; //定義結點 template <typename DataType> struct BiNode { DataType data; BiNode<DataType> *lchild,*rchild; }; template <typename DataType> class BiTree { public : // 構建函數,建立一顆二叉樹  BiTree() { root = Creat(); } // 析構函數,釋放格結點的存儲空間 ~BiTree() { Release(root); } // 前序遍歷二叉樹 void PreOrder() { PreOrder(root); } // 中序遍歷二叉樹 void InOrder() { InOrder(root); } // 后序遍歷二叉樹 void PostOrder() { PostOrder(root); } // 判斷數中是否存在X bool ExistX(DataType x) { return ExistX(root, x); } // 節點x所在的層數 int XLay(DataType x) { return XLay(root, x); } private: BiNode<DataType> * Creat(); void Release(BiNode<DataType> *bt); void PreOrder(BiNode<DataType> *bt); void InOrder(BiNode<DataType> *bt); void PostOrder(BiNode<DataType> *bt); bool ExistX(BiNode<DataType> *bt, DataType x); int XLay(BiNode<DataType> *bt, DataType x); BiNode<DataType> *root; }; // 構建函數,建立一顆二叉樹 template <typename DataType> BiNode<DataType> *BiTree<DataType>::Creat() { BiNode<DataType>* bt; char ch; cin>>ch; // 輸入結點的數據信息 if(ch == '#') bt=nullptr; // 建立一棵空樹 else { bt = new BiNode<DataType>; bt->data = ch; bt->lchild = Creat(); // 遞歸建立左子樹 bt->rchild = Creat(); // 遞歸建立右子樹  } return bt; } // 析構函數,釋放格結點的存儲空間 template <typename DataType> void BiTree<DataType> ::Release(BiNode<DataType> * bt) { if(bt == nullptr) return; else { Release(bt ->lchild); Release(bt->rchild); delete bt; } } // 前序遍歷二叉樹 template <typename DataType> void BiTree<DataType> :: PreOrder(BiNode<DataType> * bt) { if(bt == nullptr) return ; else { cout<<bt->data; PreOrder(bt->lchild); PreOrder(bt->rchild); } } // 中序遍歷二叉樹 template <typename DataType> void BiTree<DataType> :: InOrder(BiNode<DataType> * bt) { if(bt == nullptr) return ; else { InOrder(bt->lchild); cout<<bt->data; InOrder(bt->rchild); } } // 后序遍歷二叉樹 template <typename DataType> void BiTree<DataType> :: PostOrder(BiNode<DataType> * bt) { if(bt == nullptr) return ; else { PostOrder(bt->lchild); PostOrder(bt->rchild); cout<<bt->data; } } // 判斷是否存在X template <typename DataType> bool BiTree<DataType> :: ExistX(BiNode<DataType> * bt, DataType x) { if(bt == nullptr) return false; else if(bt->data == x) { return true; } else { if(ExistX(bt->lchild, x)) return true; if(ExistX(bt->rchild, x)) return true; } return false; } // 存在節點X的層數 template <typename DataType> int BiTree<DataType> :: XLay(BiNode<DataType> * bt, DataType x) { int cot=0; if(bt == nullptr) return cot; else if(bt->data == x) { cot = 1; return cot; } else { if(XLay(bt->lchild, x)) { cot = XLay(bt->lchild, x) + 1; return cot; } if(XLay(bt->rchild, x)){ cot = XLay(bt->rchild, x) + 1; return cot; } } return cot; } #endif // BITREE_H_INCLUDED

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM