1. 程式人生 > >二叉樹的基本操作的c++實現

二叉樹的基本操作的c++實現

   二叉樹的演算法。    先給出結點的類,顧名思義。是用來表示樹的每個結點咯。裡面包含char型的data(因為我想是讓樹的結點值是字母,如果你希望是數字那就int啥的,這個隨意吧~)

程式碼如下:

//Focus.L carpe diem :)

//BiTree node.h
#ifndef NODE_H_
#define NODE_H_
#define NULL 0

//結點的類
class node{
public:
	char data;   //結點值
	node *lchild, *rchild;  //左孩子,右孩子結點
	node *parent;    //父結點
	//建構函式
	node()
	{
		data = 0;
		lchild = NULL;
		rchild = NULL;
		parent = NULL;
	}
}BiTree;



#endif

   然後就是具體的操作咯。分為二叉樹的初始化,建立二叉樹,先序遍歷,中序遍歷,後序遍歷,層次遍歷,求二叉樹的深度,求二叉樹的結點數,二叉樹的複製。程式碼如下:

//Focus.L carpe diem :)

//BiTree 
#include <iostream>
#include <cstdio>
#include <cstring>
#include "node.h"

using namespace std;

//函式宣告

//二叉樹初始化
node *InitBiTree();
//銷燬二叉樹
void DestroyBiTree(node *&T);
//建立二叉樹
void CreateBiTree(node *&T);
//先序遍歷二叉樹
void PreOrderTraverse(node *T);
//中序遍歷二叉樹
void InOrderTraverse(node *T);
//後序遍歷二叉樹
void PostOrderTraverse(node *T);
//層次遍歷二叉樹
void LevelOrderTraverse(node *T);
int printLevelOrderTraverse(node *T, int level);
//二叉樹的深度
int BiTreeDepth(node *T);
//二叉樹的結點數
int BiTreeNodes(node *T);
//二叉樹的複製
void BiTreeDuplicate(node *T, node *&T1);


//二叉樹初始化
node *InitBiTree()
{
	node *T = new node();
	return T;
}

//node & initBiTree(){
//	node * T = new node();
//	return *T;
//}

//銷燬二叉樹
void DestroyBiTree(node *&T)
{
	if (T->lchild != NULL)
		DestroyBiTree(T->lchild);
	if (T->rchild != NULL)
		DestroyBiTree(T->rchild);
	delete(T);
}

//建立二叉樹
void CreateBiTree(node *&T)
{
	char ch;
	//cout << "please enter the keys:" << endl;
	cin >> ch;
	if (ch == '#')
		T = NULL;
	else
	{
		T = new node();
		T->data = ch;
		CreateBiTree(T->lchild);
		CreateBiTree(T->rchild);
	}
}

//先序遍歷二叉樹
void PreOrderTraverse(node *T)
{
	if (T != NULL)
	{
		cout << T->data;
		PreOrderTraverse(T->lchild);
		PreOrderTraverse(T->rchild);
	}
}

//中序遍歷二叉樹
void InOrderTraverse(node *T)
{
	if (T != NULL)
	{
		InOrderTraverse(T->lchild);
		cout << T->data;
		InOrderTraverse(T->rchild);
	}
}

//後序遍歷二叉樹
void PostOrderTraverse(node *T)
{
	if (T != NULL)
	{
		PostOrderTraverse(T->lchild);
		PostOrderTraverse(T->rchild);
		cout << T->data;
	}
}

//層次遍歷二叉樹演算法
int printLevelOrderTraverse(node *T, int level)
{
	if (!T || level < 0)
		return 0;
	if (level == 0)
	{
		cout << T->data << " ";
		return 1;
	}
	return printLevelOrderTraverse(T->lchild, level - 1) + printLevelOrderTraverse(T->rchild, level - 1);
}
void LevelOrderTraverse(node *T)
{
	int i = 0;
	for (i = 0;; i++)
	{
		if (!printLevelOrderTraverse(T, i))
			break;
	}
	cout << endl;
}

//二叉樹的深度
int BiTreeDepth(node *T)
{
	if (T)
	{
		int depl, depr;
		depl = BiTreeDepth(T->lchild);
		depr = BiTreeDepth(T->rchild);
		if (depl >= depr)
			return (depl + 1);
		else
			return (depr + 1);
	}
	return 0;
}

//二叉樹的結點數
int BiTreeNodes(node *T)
{
	if (T)
	{
		int num;
		num = BiTreeNodes(T->lchild);
		num = num + BiTreeNodes(T->rchild);
		num++;
		return num;
	}
	return 0;
}

//二叉樹的複製
void BiTreeDuplicate(node *T, node *&T1)
{
	if (T)
	{
		T1 = new node();
		T1->data = T->data;
		T1->lchild = T1->rchild = NULL;
		BiTreeDuplicate(T->lchild, T1->lchild);
		BiTreeDuplicate(T->rchild, T1->rchild);
	}
}

//選單
void menu()
{
	cout << "*******************Menu********************" << endl;
	cout << "enter the No of the operation you wanna do:" << endl;
	cout << "1.PreOrderTraverse" << "           " << "2.InOrderTraverse" << endl;
	cout << "3.PostOrderTraverse" << "          " << "4.LevelOrderTraverse" << endl;
	cout << "5.Get the depth of the tree" << "  " << "6.Get the numbers of the nodes" << endl;
	cout << "7.Duplicate the tree and print as PreOrderTraverse" << endl;
}


int main()
{
	int n;
	node *BiTree, *BiTree1;
	BiTree = new node();
	cout << "以先序順序輸入二叉樹,#表示空結點,應將二叉樹的所有結點都輸入進去" << endl;
	cout << "Example 想輸入a為父結點,b和c分別為左右孩子結點的時候則輸入: ab##c## " << endl;
	cout << "please enter the keys:" << endl;
	InitBiTree();
	CreateBiTree(BiTree);
	menu();
	cin >> n;
	switch (n)
	{
	case(1):
		cout << "PreOrderTraverse result:" << endl;
		PreOrderTraverse(BiTree);
		cout << endl;
		break;
	case(2) :
		cout << "InOrderTraverse result:" << endl;
		InOrderTraverse(BiTree);
		cout << endl;
		break;
	case(3) :
		cout << "PostOrderTraverse result:" << endl;
		PostOrderTraverse(BiTree);
		cout << endl;
		break;
	case(4) :
		cout << "LevelOrderTraverse result:" << endl;
		LevelOrderTraverse(BiTree);
		cout << endl;
		cout << "(PreOrderTraverse the new BiTree)" << endl;
		break;
	case(5) :
		cout << "Depth of the BiTree is:" << endl;
		cout << BiTreeDepth(BiTree) << endl;
		break;
	case(6) :
		cout << "Numbers of the BiTree Nodes is:" << endl;
		break;
		cout << BiTreeNodes(BiTree) << endl;
	case(7):
		cout << "The Duplicated Tree is:" << endl;
		BiTreeDuplicate(BiTree, BiTree1);
		PreOrderTraverse(BiTree1);
		cout << endl;
		break;
	}
	return 0;
}



     由於二叉樹的各種操作較為簡單,裡面也稍加註釋,所以就不再累述。寫blog只為自己記錄下來,也是小白,歡迎大家前來斧正:)

相關推薦

c++學習筆記—基本操作實現

用c++語言實現的二叉樹基本操作,包括二叉樹的建立、二叉樹的遍歷(包括前序、中序、後序遞迴和非遞迴演算法)、求二叉樹高度,計數葉子節點數、計數度為1的節點數等基本操作。 IDE:vs2013 具體實現程式碼如下: #include "stdafx.h" #include

線索基本操作實現

2018-11-18-18:25:23 一:二叉樹 1.二叉樹的性質   ①:在二叉樹的第i層上至多有pow(2,i-1)個結點(i>=1)。   ②:深度為k的二叉樹至多有pow(2,k)-1個結點(k>=1)。   ③:對任何一顆二叉樹T,如果其終端結點的個數為n0,度為2的結點數為

實驗四 基本操作實現

實現鏈式儲存建立,遞迴先序 中序 後序遍歷,葉子結點數,數的結點總數,交換左右子樹 #include <stdio.h> #include <stdlib.h> #include <malloc.h> int cnt; //結點宣告,資

C語言-基本操作以及搜尋基本操作

功能 二叉樹操作: 建立二叉樹 遍歷二叉樹(前序,中序,後續) 計算高度 計算結點數目 清空二叉樹 空樹判斷 二叉搜尋樹操作: 插入 最值(最大值,最小值) 刪除 程式碼 #include &l

超全C語言基本操作及講解

今天刷LeetCode上的題的時候,做到了關於二叉樹的題,於是決定把這一塊的知識整理一下。1、二叉樹的定義二叉樹通常以結構體的形式定義,如下,結構體內容包括三部分:本節點所儲存的值、左孩子節點的指標、右孩子節點的指標。這裡需要注意,子節點必須使用指標,就像我們定義結構體連結串

基本操作實現及總結(適合複習)

本文包含以下內容 1 ,二叉樹三種建立 前序遞迴 表示式非遞迴 孩子兄弟表示式非遞迴 2,遍歷 三種遍歷的遞迴與非遞迴實現(前中後序) 層次遍歷(普通二叉樹,孩子兄弟連結串列)

操作--C語言實現

div break 叠代 二叉樹 node 若是 postorder 元素 初始化 樹是一種比較復雜的數據結構,它的操作也比較多。常用的有二叉樹的創建,遍歷,線索化,線索化二叉樹的遍歷,這些操作又可以分為前序,中序和後序。其中,二叉樹的操作有遞歸與叠代兩種方式,鑒於我個人的

基本操作

arch 非遞歸 alt pro stack depth 隊列 步驟 read 廣度優先搜索 1、把根節點入隊列; 2、如果隊列非空,出隊,再依次將左子樹入隊、右子樹入隊; 3、重復步驟2,直到隊列為空。 void BreadFirstSearch(TreeNode *ro

【資料結構】基本操作

文章目錄 BinaryTree.h BinaryTree.c Test.c 棧和佇列的相關函式: 棧:https://blog.csdn.net/weixin_41892460/article/details/82

資料結構之基本功能的實現

二叉樹的各種性質在這裡不再重複,本文實現二叉樹的基本操作,包括建立、前序輸出、中序輸出、後序輸出、刪除二叉樹、葉子結點個數、葉子節點的值、交換左右子樹 1.首先建立結構體: typedef struct Tree_Node{ char ch; struct

基本運算演算法實現

二叉樹的基本運算演算法實現: 1.建立二叉樹:根據二叉樹的括號表示法的字串生成二叉鏈儲存結構 2.銷燬二叉樹:釋放所有結點分配的空間 3.查詢結點 4.查詢孩子結點 5.求二叉樹高度 6.輸出二叉樹:用括號表示法 建立二叉樹 typedef struct no

遍歷c++實現

//自己還真是個菜雞,大一學了一年c++,現在還在基礎的語法上轉圈,還沒有意識到c++真正的 //的強大之處在於它的多變,封裝,等演算法告一段落了在考慮是往Java上走還是深造c++ #include <iostream> #include <stack&

遍歷-c實現

bin lib malloc code mage -a oid inf 樹遍歷 這裏主要是三種遍歷,先序(preorder,NLR),中序(Inorder,LNR),後序(Postorder,LRN) N:node,L:left,R:right 基本排序:先序(NLR,

的先序、中序、後序遍歷等基本操作c++實現

二叉樹:樹的每個節點最多有兩個子節點。1.實現二叉連結串列的結構://節點結構template<class T>struct  BinaryTreeNode{BinaryTreeNode<T>* _left;//左子樹BinaryTreeNode<

基本實現(包含main方法)

所用編譯器;Devc++(有些編譯器編譯不了,建議使用Devc++) 所用語言:C語言 邏輯結構:非線性結構 儲存結構:鏈式儲存結構 寫在前面:學習二叉樹之前也有找過一些學習資料,資料結構的書,部落格文章,但是都大概講述的是方法,並沒有給出完整的且比較適合初學者的,今天剛剛學習了二叉

基礎操作 ,前中後序遍歷,求高度,搜尋排序)Java實現 程式碼集合

首先,定義一個樹類Tree.java public class Tree { public TreeNode root; } 定義樹節點類TreeNode.java public class TreeNode { public TreeNode(int

基本功能實現

一、二叉樹的鏈式儲存 用連結串列來表示一顆二叉樹,每個結點由三個域組成,除了資料域,還有兩個指標域,分別用來存放左右孩子的儲存地址。 typedef struct BiTNode { char data; struct BiTNode *

基本函式實現

二叉樹的基本實現  #pragma once #include <iostream> #include<queue> #include<stack> using namespace std; #include<assert.h> #

[leetcode]Same Tree(判斷兩個是否相等 C語言實現)

Same Tree Given two binary trees, write a function to check if they are equal or not. Two binary trees are considered equal if th

資料結構之 AVL(平衡)(C語言實現

AVL樹(平衡二叉樹) 1. AVL樹定義和性質 AVL(Adelson-Velskii和Landis發明者的首字母)樹時帶有平衡條件的二叉查詢樹。 二叉查詢樹的效能分析: 在一顆左右子樹高度平衡情況下,最優的時間複雜度為O(log2n),這與這半