求二叉樹左右子樹高度差_6.7 二叉樹的左右子樹交換
阿新 • • 發佈:2021-02-05
技術標籤:求二叉樹左右子樹高度差
返回目錄:
Chilan Yu:《資料結構》目錄連結zhuanlan.zhihu.com【問題描述】
二叉樹按照二叉連結串列的方式儲存。編寫程式,計算二叉樹中葉子結點的數目並輸出;編寫程式,將二叉樹的左右子樹進行交換,並輸出交換後的二叉樹的後序遍歷序列。
【輸入形式】
二叉樹的前序遍歷序列,空指標的位置輸入字元#
【輸出形式】
葉子結點的數目
左右子樹交換後,後序遍歷的序列,空子樹的位置輸出字元#
【樣例輸入】
ABE##F##CG###
【樣例輸出】
3 ###GC##F##EBA
#include <iostream> #include <stdlib.h> #include <stdio.h> #include <cstring> using namespace std; typedef struct Node{ char data; struct Node * LChild; struct Node * RChild; }BiTNode, * BiTree; /*用擴充套件先序遍歷序列建立二叉連結串列*/ void CreateBiTree(BiTree * bt){//這邊的bt是指標的指標 char ch; ch = getchar(); if(ch=='#') *bt = NULL; else{ *bt = (BiTree)malloc(sizeof(BiTNode));//用(*bt)指標開闢結點空間 (*bt)->data = ch; CreateBiTree( &( (*bt)->LChild ) ); CreateBiTree( &( (*bt)->RChild ) ); } } /*後序遍歷輸出二叉樹中的結點(左右根)*/ void PostOrder(BiTree root){//後序遍歷輸出二叉樹結點,root為指向二叉樹(或某一子樹)根結點的指標 if(root!=NULL){//如果root不為空 PostOrder(root->LChild);//後序遍歷左子樹 PostOrder(root->RChild);//後序遍歷右子樹 printf("%c",root->data);//輸出根結點 } else cout << "#"; } /*分治演算法統計葉子結點數目*/ int leaf(BiTree root){//root為指向二叉樹(或某一子樹)根結點的指標 int LeafCount; if(root==NULL) LeafCount = 0;//如果是空樹,返回0 else if( (root->LChild==NULL) && (root->RChild==NULL) )//如果只有一個結點(沒有左子樹和右子樹),返回1 LeafCount = 1; else//否則葉子數為左右子樹的葉子結點數之和 LeafCount = leaf(root->LChild) + leaf(root->RChild); return LeafCount; } void Mirror(BiTree root){//第一種交換方法 if(root==NULL) return; if((root->LChild==NULL) && (root->RChild==NULL)) return; BiTree temp = root->LChild; root->LChild = root->RChild; root->RChild = temp; Mirror(root->LChild); Mirror(root->RChild); } void Change(BiTree root){//第二種交換方法 if(root!=NULL){ Change(root->LChild); Change(root->RChild); BiTNode *p; p=root->LChild; root->LChild=root->RChild; root->RChild=p; } } int main() { BiTree t; CreateBiTree(&t); cout << leaf(t) << endl; // Mirror(t); Change(t); PostOrder(t); return 0; }