最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

創(chuàng)建二叉樹 二叉樹如何刪除節(jié)點操作教程

 更新時間:2012年12月03日 10:21:45   作者:  
本文將詳細介紹二叉樹的創(chuàng)建,節(jié)點刪除,節(jié)點增加等一系列操作方法,需要的朋友可以參考下
復制代碼 代碼如下:

// 二叉樹.cpp : 定義控制臺應用程序的入口點。
//
/*
*二叉樹作業(yè)
*2012.12.1 13:55
*Made By Karld Vorn Doenitz
*/
#include "stdafx.h"
#include<iostream>
#include<string>
using namespace std;
class TreeNode{//建立節(jié)點類
public:
char num;
TreeNode *leftchild,*rightchild;
};
class Queue{//建立隊列類
public:
int front,rear;
TreeNode *elem;
};
void cmd();
void initQueue(Queue *q);
bool isEmpty(Queue *q);
void enQueue(Queue *q,TreeNode *e);
void outQueue(Queue *q,TreeNode *e);
void createBiTree(TreeNode * &T);
TreeNode* PreFind(TreeNode *T,char da);
void order(TreeNode *T);
void midOrder(TreeNode * T);
void addChild(TreeNode *T,char clue,char add,string side);
void deleteNode(TreeNode *T,char delchar);
int main(){//主函數
cmd();
return 0;
}
void cmd(){//命令函數
/*
*以下為命令行指令
*共有六種命令
*/
char commands;
TreeNode *T=NULL;
cout<<"*"<<"___________命令如下_______________"<<endl;
cout<<"*"<<"1、按下c鍵先序創(chuàng)建二叉樹; "<<"*"<<endl;
cout<<"*"<<"2、按下m鍵中序遞歸遍歷二叉樹; "<<"*"<<endl;
cout<<"*"<<"3、按下o鍵層次遍歷二叉樹; "<<"*"<<endl;
cout<<"*"<<"4、按下s鍵給定元素查找節(jié)點; "<<"*"<<endl;
cout<<"*"<<"5、按下i鍵指定位置插入節(jié)點; "<<"*"<<endl;
cout<<"*"<<"6、按下d鍵刪除指定的節(jié)點; "<<"*"<<endl;
cout<<"*"<<"請輸入你的選擇: "<<"*"<<endl;
cout<<"*"<<"__________________________________"<<endl;
cin>>commands;
while(commands){
/*
*采用switch語句
*while循環(huán)
*/
switch (commands){
case 'c':
{
cout<<"輸入要創(chuàng)建的二叉樹,以#為空節(jié)點。"<<endl;
createBiTree(T);
}break;
case 'm':
{ if(T==NULL)cout<<"此二叉樹為空,請先創(chuàng)建二叉樹!!!"<<endl;
else{
cout<<"中序遍歷二叉樹的結果為:";
midOrder(T);
cout<<endl;}
}break;
case 'o':{
if(T==NULL)cout<<"此二叉樹為空,請先創(chuàng)建二叉樹!!!"<<endl;
else{cout<<"層次遍歷二叉樹的結果為:";
order(T);
cout<<endl;
} }break;
case 's':{char ch;
cout<<"輸入要查找的元素:"<<endl;
cin>>ch;
cout<<"要找的節(jié)點的左孩子是:";
TreeNode *bt=PreFind(T,ch);
if(bt->leftchild!=NULL)
cout<<bt->leftchild->num<<endl;
else cout<<"此節(jié)點是葉子,無左孩子!!!"<<endl;
cout<<"要找的節(jié)點的右孩子是:";
if(bt->rightchild!=NULL)
cout<<bt->rightchild->num<<endl;
else cout<<"此節(jié)點是葉子,無右孩子!!!"<<endl;
}break;
case 'i':{char clue,add;
string side;
cout<<"輸入插入位置:";
cin>>clue;
cout<<"輸入插入的元素:";
cin>>add;
cout<<"選擇要插入的是左子樹(請輸入left)還是右子樹(請輸入right)";
cin>>side;
addChild(T,clue,add,side);
}break;
case 'd':{
char del;
cout<<"輸入要刪除的節(jié)點的元素值:"<<endl;
cin>>del;
deleteNode(T,del);
}break;
default:cout<<"輸入選擇非法";break;
}
cout<<"輸入你的選擇:"<<endl;
cin>>commands;
}
}
void initQueue(Queue *q){//初始化隊列
q->elem=new TreeNode;
q->front=q->rear=0;
}
bool isEmpty(Queue *q){//檢查隊列是否為空
if(q->front==q->rear)
return true;//隊為空
else return false;//隊不為空
}
void enQueue(Queue *q,TreeNode *e){//入隊
q->elem[q->rear]=*e;
q->rear++;
}
void outQueue(Queue *q,TreeNode *e){//出隊
if(q->front==q->rear)return;
*e=q->elem[q->front];
q->front++;
}
void createBiTree(TreeNode * &T){//創(chuàng)建二叉樹
char ch;
cin>>ch;
if(ch=='#') T=NULL;
else {//采用遞歸先序創(chuàng)建二叉樹
T=new TreeNode;
T->num=ch;
createBiTree(T->leftchild);
createBiTree(T->rightchild);
}
}
TreeNode* PreFind(TreeNode *T,char da){//給定元素值查找結點指針位置并返回其指針,此方法采用的先序遍歷
TreeNode *temp;
TreeNode *tree[20];
int top=0;
while(T!=NULL||top!=0){
while(T!=NULL){
if(T->num==da)
temp=T;
top++;
tree[top]=T;
T=T->leftchild;
}
if(top!=0){
T=tree[top]->rightchild;
top--;
}
}
return temp;
}
void order(TreeNode *T){//層序遍歷二叉樹
Queue *q=new Queue;
TreeNode *p=new TreeNode;
if(T!=NULL) {
initQueue(q);
enQueue(q,T);
while(!isEmpty(q)){//將根節(jié)點的左右兩個子節(jié)點推入隊內
outQueue(q,p);
cout<<p->num<<" ";
if(p->leftchild!=NULL)
enQueue(q,p->leftchild);
if(p->rightchild!=NULL)
enQueue(q,p->rightchild);
}
}else
cout<<"此二叉樹為空!!!";
}
void midOrder(TreeNode * T){//二叉樹中序遞歸遍歷
if(T!=NULL){
midOrder(T->leftchild);//中序遍歷T的左子樹
cout<<T->num<<" "; //訪問根節(jié)點
midOrder(T->rightchild);//中序遍歷T的右子樹
}
}
void addChild(TreeNode *T,char clue,char add,string side){//插入左右孩子操作,根據clue查找節(jié)點,由side決定插入左孩子還是右孩子
TreeNode *&late=new TreeNode;
late->num=add;
late->leftchild=NULL;
late->rightchild=NULL;
TreeNode *original=PreFind(T,clue);//查找指定的節(jié)點
if(side=="left"){
if(original->leftchild==NULL){//根結點的左孩子結點為空
original->leftchild=late;
}
}else{
if(original->rightchild==NULL){//根結點的右孩子結點為空
original->rightchild=late;
}
}
}
void deleteNode(TreeNode *T,char delchar){ //刪除節(jié)點及其子節(jié)點
if (T!=NULL){//如果根節(jié)點不為空
if (T->num==delchar){//如果根節(jié)點為要刪除的節(jié)點
delete T->leftchild;//刪除左孩子節(jié)點
T->leftchild=NULL;//左指針指向NULL
delete T->rightchild;//刪除右孩子節(jié)點
T->rightchild=NULL;//右指針指向NULL
delete T;//刪除節(jié)點T
}else if (T->leftchild!=NULL&&T->leftchild->num==delchar){//如果左孩子為要刪除的節(jié)點
delete T->leftchild->leftchild;//先刪除左孩子的左孩子
delete T->leftchild->rightchild;//再刪除左孩子的右孩子
delete T->leftchild;//最后刪除左孩子
T->leftchild=NULL;//左指針為空
}else if (T->rightchild!=NULL&&T->rightchild->num==delchar){//如果右孩子為要刪除的節(jié)點
delete T->rightchild->leftchild;//先刪除右孩子的左孩子
delete T->rightchild->rightchild;//再刪除右孩子的右孩子
delete T->rightchild;//最后刪除右孩子
T->rightchild=NULL;//右指針為空
}else {
if(T->leftchild!=NULL){ //如果左孩子不為空
deleteNode(T->leftchild,delchar);//刪除左孩子結點
}if(T->rightchild!=NULL){ //如果右孩子不為空
deleteNode(T->rightchild,delchar);//刪除右孩子節(jié)點
}
}
}
}

相關文章

  • 純C語言:分治問題源碼分享

    純C語言:分治問題源碼分享

    這篇文章主要介紹了純C語言:分治問題源碼,有需要的朋友可以參考一下
    2014-01-01
  • 基于Matlab制作一個數獨求解器

    基于Matlab制作一個數獨求解器

    這篇文章主要為大家詳細介紹了如何利用Matlab制作一個數獨求解器,文中的示例代碼講解詳細,對我們學習Matlab有一定幫助,需要的可以參考一下
    2022-05-05
  • C語言Iniparser庫實現ini文件讀寫

    C語言Iniparser庫實現ini文件讀寫

    iniparser是針對INI文件的解析器。ini文件則是一些系統(tǒng)或者軟件的配置文件。本文就來介紹一下如何利用Iniparser庫實現ini文件讀寫吧
    2023-03-03
  • C++類型轉換運算符的實例詳解

    C++類型轉換運算符的實例詳解

    這篇文章主要介紹了C++類型轉換運算符的實例詳解的相關資料,希望通過本文大家能夠掌握這部分內容,需要的朋友可以參考下
    2017-09-09
  • C語言實現簡單職工信息管理系統(tǒng)

    C語言實現簡單職工信息管理系統(tǒng)

    這篇文章主要為大家詳細介紹了C語言實現簡單職工信息管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • WIN32程序獲取父進程ID的方法

    WIN32程序獲取父進程ID的方法

    這篇文章主要介紹了WIN32程序獲取父進程ID的方法,在進行windows程序開發(fā)的時候有一定的實用價值,需要的朋友可以參考下
    2014-08-08
  • Qt中QPushButton組件的使用詳解

    Qt中QPushButton組件的使用詳解

    QPushButton是Qt庫中的一個重要組件,本文主要介紹了Qt中QPushButton組件的使用詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-07-07
  • 在C語言項目中有效進行異常處理機制(最新推薦)

    在C語言項目中有效進行異常處理機制(最新推薦)

    本文將探討在C語言項目中如何設計和實現錯誤處理機制,以確保程序的健壯性和可靠性,感興趣的朋友一起看看吧
    2025-03-03
  • C語言深入探究水仙花數與變種水仙花數代碼

    C語言深入探究水仙花數與變種水仙花數代碼

    求水仙花數和變種水仙花數是非常適合初學者學習的代碼,其中包含的循環(huán)和邏輯方式等知識點。這既能起到對以往知識的復習,也可以學習到一種不同的邏輯思考方式
    2022-05-05
  • C語言實現四窗口聊天

    C語言實現四窗口聊天

    這篇文章主要為大家詳細介紹了C語言實現四窗口聊天,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06

最新評論

隆子县| 平度市| 隆安县| 铜梁县| 航空| 衡山县| 南乐县| 平度市| 黄大仙区| 南乐县| 五峰| 辽源市| 民丰县| 禹城市| 平安县| 吴桥县| 安陆市| 茶陵县| 永川市| 偏关县| 望江县| 秦安县| 皋兰县| 阿克| 兰州市| 会宁县| 卓尼县| 南郑县| 阳原县| 峨眉山市| 嘉峪关市| 墨江| 哈密市| 玉龙| 舟曲县| 镇平县| 丹东市| 蒲江县| 杭锦后旗| 遂宁市| 平泉县|