二叉樹的基本操作的c++實現
程式碼如下:
//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),這與這半