日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

二叉树前序中序后续线索树_二叉树的先序,中序,后序遍历以及线索二叉树的遍历...

發布時間:2023/12/10 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 二叉树前序中序后续线索树_二叉树的先序,中序,后序遍历以及线索二叉树的遍历... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

二叉樹的先序,中序,后序遍歷以及線索二叉樹的遍歷

(2008-05-04 17:52:49)

標簽:

雜談

C++

二叉樹的先序,中序,后序遍歷以及線索二叉樹的遍歷

頭文件

//*******************************************************************************

//二叉樹中的數據類型為ElemType

//*******************************************************************************

// BinaryTree.h: interface for the CBinaryTree class.

//

//

#include //C++語言

#define OK 1

#define ERROR 0

class CBinaryTree

{

public:

CBinaryTree();

virtual ~CBinaryTree();

protected:

typedef int ElemType;

struct Node

{ //數據

ElemType data; //數據域信息

int lt; //前繼指針標志

int rt; //后繼指針標志

Node* lchild; //指向左孩子

Node* rchild; //指向右孩子

}*root,*head;

public:

int Create();

int PreOrderTraverse();

int MidOrderTraverse();

int LastOrderTraverse();

void LevelOrderTraverse();

int GetLeafCount();

int GetDepth();

int GetNodeCount();

int MidOrderTraverseThr();

void ChangeLeftRight();

void Destroy();

private: //重載以上函數,供以上函數調用

int Create(Node* &node);

int PreOrderTraverse(Node*node);

int MidOrderTraverse(Node*node);

int LastOrderTraverse(Node *node);

int GetLeafCount(Node*node);

void GetNodeCount(Node*node,int &count);

int GetDepth(Node*node);

void ChangeLeftRight(Node*node);

void Visit(Node*node);

void Destroy(Node*node);

};

// 實現文件

// BinaryTree.cpp: implementation of the CBinaryTree class.

#include "BinaryTree.h"

#include "Stack.h"

#include "Queue.h"

//

// Construction/Destruction

//

CBinaryTree::CBinaryTree()

{

root=NULL;

head=NULL;

}

CBinaryTree::~CBinaryTree()

{

Destroy();

}

int CBinaryTree::Create()

{ //創建一個二叉樹

return Create(root);

//用戶調用此函數,創建根結點,由此函數調用其內的

//CreateNode()創建除根結點外的其它所有結點

}

int CBinaryTree::PreOrderTraverse()

{ //先序遍歷二叉樹

return PreOrderTraverse(root);

}

int CBinaryTree::MidOrderTraverse()

{ //中序遍歷二叉樹

return MidOrderTraverse(root);

}

int CBinaryTree::LastOrderTraverse()

{ //后序遍歷二叉樹

return LastOrderTraverse(root);

}

void CBinaryTree::LevelOrderTraverse()

{ //借助于堆棧,完成二叉樹的層次遍歷

CQueue queue;

if(!root) return;

queue.InitQueue();

Node*p=root; //初始化

Visit(p);

queue.EnQueue((long)p);

//訪問根結點,并將根結點地址入隊

while(!queue.QueueEmpty())

{ //當隊非空時重復執行下列操作

p=(Node*)queue.DeQueue(); //地址出隊

if(p->lchild)

{

Visit(p->lchild);

queue.EnQueue((long)p->lchild); //處理左孩子

}

if (p->rchild)

{

Visit(p->rchild);

queue.EnQueue((long)p->rchild); //處理右孩子

}

}

}

int CBinaryTree::GetLeafCount()

{ //返回葉子結點數

return GetLeafCount(root);

}

int CBinaryTree::GetNodeCount()

{ //返回總結點數

int count=0;

GetNodeCount(root,count);

return count;

}

int CBinaryTree::GetDepth()

{ //返回二叉樹的深度

return GetDepth(root);

}

void CBinaryTree::ChangeLeftRight()

{ //交換左右兩孩子結點

if(root!=NULL)

ChangeLeftRight(root);

}

int CBinaryTree::Create(Node *&node)

{

int i;

cout<

不創建本結點):";

cin>>i;

if(i==0)

node=NULL;

else

{

if(!(node=new Node))

return ERROR;

node->data=i;

node->lt=0;

node->rt=0;

Create(node->lchild); //創建左子樹

Create(node->rchild); //創建右子樹

}

return OK;

}

int CBinaryTree::PreOrderTraverse(Node *node)

{

if(node!=NULL)

{

cout<data<

if(PreOrderTraverse(node->lchild)) //遍歷左子樹

if(PreOrderTraverse(node->rchild)) //遍歷右子樹

return 1;

return 0;

}

else

return 1;

}

int CBinaryTree::MidOrderTraverse(Node *node)

{

if(node!=NULL)

{

if(MidOrderTraverse(node->lchild))//遍歷左子樹

cout<data<

if(MidOrderTraverse(node->rchild))//遍歷右子樹

return 1;

return 0;

}

else

return 1;

}

int CBinaryTree::LastOrderTraverse(Node *node)

{

if(node!=NULL)

{

if(LastOrderTraverse(node->lchild)) //遍歷左子樹

if(LastOrderTraverse(node->rchild)) //遍歷右子樹

{

cout<data<

return 1;

}

return 0;

}

else

return 1;

}

int CBinaryTree::MidOrderTraverseThr()

{ //中序線索化二叉樹

if(head!=NULL)

delete head;

head=new Node;

if(head==NULL)

return 0;

int i=0;

Node*pre=NULL,*cur=NULL;

long *temp=new long[GetNodeCount()];

head->lt=0; //無前驅,有左孩子

head->rt=1; //有后繼,無右孩子

head->rchild=head;

if(root==NULL)

head->lchild=head;

else

{

head->lchild=root;

pre=head;

cur=root;

for(;i>0 || cur!=NULL;)

{

for(;cur!=NULL;temp[i]=(long)cur,i++,cur=cur->lchild);

if(i>0)

{

cur=(Node*)temp[--i];

cout<data<

if(cur->lchild==NULL)

{

cur->lt=1;

cur->lchild=pre;

}

if(pre->rchild==NULL)

{

pre->rt=1;

pre->rchild=cur;

}

pre=cur;

cur=cur->rchild;

}

}

pre->rchild=head;

pre->rt=1;

head->rchild=pre;

}

delete temp;

return 1;

}

void CBinaryTree::GetNodeCount(Node *node,int &count)

{

if(node!=NULL)

count++;

else

return;

GetNodeCount(node->lchild,count);//統計左子樹個數

GetNodeCount(node->rchild,count);//統計右子樹個數

}

int CBinaryTree::GetDepth(Node *node)

{

int d=0,depthr=0,depthl=0;

if (node==NULL)

return 0; // 如果是空樹,則其深度為 0

else

{

depthl=GetDepth(node->lchild); //求node

的左子樹的深度

depthr=GetDepth(node->rchild); //求node

的右子樹的深度

return depthl>=depthr?1+depthl:1+depthr;

}

}

int CBinaryTree::GetLeafCount(Node *node)

{

int n,m;

if(node==NULL)

return 0; // 如果二叉樹是空樹,則返回 0

else if((node->lchild==NULL) &&

(node->rchild==NULL))

return 1; //

如果二叉樹的左孩子和右孩子均為空,則返回

1

else // 如果二叉樹的左孩子或右孩子不為空

{

n=GetLeafCount(node->lchild); //

求左子樹的葉子結點數目

m=GetLeafCount(node->rchild); //

求右子樹的葉子結點數目

return n+m; // 返回總的葉子結點數目

}

}

void CBinaryTree::ChangeLeftRight(Node *node)

{

if(node!=NULL)

{

ChangeLeftRight(node->lchild);

ChangeLeftRight(node->rchild);

Node*temp=node->lchild;

node->lchild=node->rchild;

node->rchild=temp;

}

}

void CBinaryTree::Visit(Node *node)

{ //訪問結點

cout<data<

}

void CBinaryTree::Destroy()

{ //銷毀二叉樹

Destroy(root);

root=NULL;

if(head)

delete head;

head=NULL;

}

void CBinaryTree::Destroy(Node *node)

{

if(node!=NULL)

{

Destroy(node->lchild);

Destroy(node->rchild);

delete node;

node=NULL;

}

}

分享:

喜歡

0

贈金筆

加載中,請稍候......

評論加載中,請稍候...

發評論

登錄名: 密碼: 找回密碼 注冊記住登錄狀態

昵???稱:

評論并轉載此博文

發評論

以上網友發言只代表其個人觀點,不代表新浪網的觀點或立場。

后一篇?>游戲名稱

總結

以上是生活随笔為你收集整理的二叉树前序中序后续线索树_二叉树的先序,中序,后序遍历以及线索二叉树的遍历...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 91影院在线观看 | 精品国产乱码久久久久久图片 | 色噜噜噜 | 国产白丝一区二区三区 | 黄色在线观看国产 | 日韩激情视频一区二区 | 一区二区三区蜜桃 | 高清视频在线免费观看 | 波多野结衣在线视频播放 | 人体裸体bbbbb欣赏 | 久久久综合精品 | 日韩黄色免费网站 | 台湾佬中文字幕 | 国产a级片| 在线免费观看污视频 | 亚洲操操操 | 欧美一级黄色片 | 国产精品久久欧美久久一区 | 自拍欧美亚洲 | 日韩爆操| 亚洲欧美日韩一区二区三区在线观看 | 日韩高清一区二区 | 久久精品资源 | 在线观看免费视频 | 福利在线观看 | 岛国av在线免费 | 中国浓毛少妇毛茸茸 | 男人天堂最新网址 | 久久国产精品视频 | 日韩一级| 久久三级网站 | 亚洲色图综合 | 爱爱二区| 性午夜| 国产伦精品一区二区 | 欧美真人性野外做爰 | 永久黄色网址 | 97久久人澡人人添人人爽 | 99久久人妻无码精品系列 | julia一区二区 | 91av俱乐部| 在线日本中文字幕 | 欧美色图网址 | 都市激情国产精品 | 最新毛片网 | 日韩黄色影视 | 成人久久影院 | 中文在线а√在线 | 亚洲永久无码7777kkk | 成年视频在线播放 | 无码人妻精品一区二区三区夜夜嗨 | 亚洲最大福利视频 | 国产日产欧美一区二区 | 福利视频不卡 | 国产精品嫩草影院桃色 | 91网站免费视频 | 美女福利视频网 | 草草视频网站 | 国产femdom调教7777 | 一级免费观看视频 | 国产亚洲精久久久久久无码77777 | 精品少妇一区二区三区 | 国产亚洲一区二区三区四区 | 免费av高清 | 国产三级精品三级在线观看 | 在线午夜av | 日本一区视频在线播放 | 草草视频在线观看 | 中文字幕一区二区视频 | 日本高清视频免费看 | 岛国精品在线播放 | av视觉盛宴 | 深夜福利视频网站 | 国产肥老妇视频 | 神宫寺奈绪一区二区三区 | 国产日韩欧美在线观看视频 | 亚洲国产精一区二区三区性色 | 国产激情视频一区二区 | 黄色录像二级片 | 福利在线免费观看 | 欧美精品第二页 | 激情伦成人综合小说 | 免费观看黄色小视频 | 精品中文字幕一区 | 亚洲区成人 | 日韩久久高清 | 国产小视频自拍 | 免费黄色小视频在线观看 | 国产免费又爽又色又粗视频 | 最新国产精品自拍 | av影视在线观看 | 亚洲天堂成人av | 欧美一区二区三区久久成人精品 | 中文av一区 | 日韩永久免费视频 | 日韩国产免费 | 久久国产福利 | 亚洲欧洲无码一区二区三区 | 男男h黄动漫啪啪无遮挡软件 |