C 資料結構之 二叉樹簡單實現和4種遍歷

2021-07-10 05:06:56 字數 3618 閱讀 1569

實驗目的:實現簡單的二叉樹!

標頭檔案:

二叉樹.h

#ifndef 二叉樹_h__

#define 二叉樹_h__

#include

#include

templateclass binarytree;//二叉樹的宣告

/*樹的節點*/

template

class treenode };

//二叉樹的定義

template

class binarytree;

template

void binarytree::levelorder()

template

void binarytree::levelorder(treenode*currentnode)

if (currentnode->rightchild)

if (q.empty())

//在彈出乙個節點時,我們要先把它的左右孩子先放進佇列裡

currentnode = q.front();//取隊首的節點,

q.pop();}}

template

void binarytree::visit(treenode*currentnode)

template

void binarytree::endorder()

template

void binarytree::endorder(treenode*currentnode)}

template

void binarytree::preorder()

template

void binarytree::preorder(treenode*currentnode)

}template

void binarytree::inorder()

template

void binarytree::inorder(treenode*currentnode)

}#endif // 二叉樹_h__

/* 遍歷的規則:

中序遍歷:左子樹-節點-右子樹

先序遍歷:節點-左子樹-右子樹

後序遍歷:左子樹-右子樹-節點

層序遍歷:一層一層遍歷*/

實驗的二叉樹圖

原始檔

main.cpp

#include

#include "二叉樹.h"

using namespace std;

int main(int argc,const char* argv);

#endif

#include "node.h"

node::node(){}

node::node(int item)

node::~node(){}

void node::setdata(int item)

int node::getdata()

void node::setleft(node* left)

node* node::getleft()

void node::setright(node* right)

node* node::getright()

#pragma once

#ifndef binarytree_h__

#define binarytree_h__

#include "node.h"

class binarytree;

#endif // binarytree_h__

#include "binarytree.h"

#include

#include

using namespace std;

binarytree::binarytree()

binarytree::~binarytree(){}

//獲取根節點

node* binarytree::getroot()

void binarytree::creatbinarytree() //建立一棵二叉樹

}//新增節點函式

void binarytree::addnode(node* newnode, node* root)

else }

else if (toright(newnode->data, root->data))

else}}

void binarytree::preorder(node* t)//先根遍歷

}void binarytree::inorder(node* t)//中根遍歷

}void binarytree::postorder(node* t)//後根遍歷}

//層序遍歷

void binarytree::levelorder(node* t)

//把有孩子放進去

if (t->right!=nullptr)

if (myqueue.empty())

//獲取當前的節點

t = myqueue.front();

myqueue.pop(); }

}//尋找data為item的節點

node* binarytree::finddata(node* t, int item)

else if (t->getdata()==item)

else if ((p=finddata(t->getleft(),item))!=nullptr)

else

}//尋找給定節點的父節點

node* binarytree::returnfather(node* t, node *p)

else if (t->getleft()==p || t->getright()==p)

else if ((q=returnfather(t->getleft(),p))!=nullptr)

else

}//刪除t節點及其左右子樹

void binarytree::deletesubtree(node* t)

else if (t==root)

node* p, *q;

p = t;

q = returnfather(root, p);

if (q)

else

}deletall(p);

}//判斷新增節點是否比根小

bool binarytree::toleft(int newitemvalue, int rootvalue)

else

}//無情乾掉子節點和左右子樹

資料結構之二叉樹實現

1.二叉樹的原理分析 樹是一種重要的非線性資料結構,直觀地看,它是資料元素 在樹中稱為結點 按分支關係組織起來的結構。二叉樹 binary tree 是每個節點最多有兩個子樹的有序樹。通常子樹被稱作 左子樹 和 右子樹 二叉樹演算法的排序規則 1 選擇第乙個元素作為根節點 2 之後如果元素大於根節點...

資料結構之二叉樹 C 二

目錄 table of contents 類的部分實現 二叉樹是一種特殊的樹,在上一節中也介紹了樹的其他形式,例如 霍夫曼樹,b樹等。其中,二叉樹的常用操作有 1.確定樹高 2.確定元素數目 3.複製 4.顯示或列印二叉樹 5.確定兩顆二叉樹是否一樣 6.刪除整顆樹 這些操作都可以通過有步驟的遍歷二...

資料結構系列之二叉樹(C 實現)

struct treenode 遞迴寫法很水,這裡就不在展開描述了,直接貼 void preorder treenode head cout head val 中 preorder head leftchild 左 preorder head rightchild 右 void inorder tr...