1. 程式人生 > >用C++實現一個二叉樹類

用C++實現一個二叉樹類

/*
* 昨天參加宜搜的筆試,要求用C++寫一二叉樹類,實現插入,刪除,定位功能,輾轉再三,
* 卻無從下手,甚急,終基礎不好,今天再想,通過層次遍歷二叉樹,再進行實現相關功能
* 實也不難. 以下程式碼
*/

/*
* FileName:BTree.cpp
* Description:binary tree with insert, delete, find
* Date:2007-11-4
*/


#include
<iostream>
#include
<deque>
usingnamespace std;

//binary node with parent node
template<typename T
>
class node
{
public:
    node(
const T &v, node<T>*L=NULL, node<T>*R=NULL, node<T>*P=NULL):left(L),right(R),par(P)
    
{
        value 
= v;
    }


public:
    T value;
    node
<T>*left, *right, *par;
}
;

// binary tree
template<typename T>
class BTree
{
public:
    BTree(node
<T>*R=NULL):root(R)
    
{ }
    
~BTree()
    

        
if(root)
            delall();
    }


    node
<T>*findby(const T &v);    // 層次遍歷,返回找到第一個結點值為v的結點指標
void Insert(const T &v);        // 層次遍歷二叉樹,將值插在遇到的第一個葉子或者子樹不全的結點上
bool delby(const T &v);            // 層次遍歷二叉樹,刪除遇到的第一個結點值為v的結點
    
    node
<T>*findleave(node<T>*cur); // 層次遍歷二叉樹,返回cur下遇到的第一個葉子結點
void delall();
    
void display(node<T>*r);        // 先序遍歷,列印二叉樹各結點的值

public:
    node
<T>*root;
}
;

template
<typename T>
node
<T>*BTree<T>::findby(const T &v)
{
    deque
< node<T>*> Q;
    
bool isfind; // find v ==> isfind = true; not find ==> isfind = false
    node<T>*tmp;

    
if(root)
        Q.push_back(root);
    
else
    
{
        
return NULL;
    }


    isfind 
=false;
    tmp 
= NULL;
    
while(!Q.empty() &&!isfind)
    
{
        tmp 
= Q.front();
        Q.pop_front();

        
if(tmp->value == v)
            isfind 
=true;
        
else
        
{
            
if(tmp->left)
                Q.push_back(tmp
->left);
            
if(tmp->right)
                Q.push_back(tmp
->right);
        }

    }

    
    
if(!isfind)
        tmp 
= NULL;

    
return tmp;
}


template
<typename T>
void BTree<T>::Insert(const T &v)
{
    deque
< node<T>*> Q;
    node
<T>*cur;

    
if(root)
        Q.push_back(root);
    
else
    
{
        root 
=new node<T>(v, NULL, NULL, NULL);
        
return;
    }


    
while(!Q.empty()) // 原來是這裡出錯了.第一次是寫了Q.empty(),應該是!Q.empty()
{
        cur 
= Q.front();
        Q.pop_front();

        
if(cur->left)
            Q.push_back(cur
->left);
        
else
        
{
            cur
->left =new node<T>(v, NULL, NULL, cur);
            
return;
        }

        
        
if(cur->right)
            Q.push_back(cur
->right);
        
else
        
{
            cur
->right =new node<T>(v, NULL, NULL, cur);
            
return;
        }

    }

}


template
<typename T>
bool BTree<T>::delby(const T &v)
{
    node
<T>*cur, *tmp;
    
bool isleave; // 判斷是不是葉子結點
    
    isleave 
=false;
    cur 
= NULL;
    cur 
= findby(v);
    
if(!cur) // 說明不存在結點值為v的結點
returnfalse;
    
else
    
{
        
if(cur->left && cur->right) // 左右子樹不為空
{
            tmp 
= findleave(cur); // 通過層次遍歷,找出cur下第一個葉子結點
            tmp->left = cur->left;
            tmp
->right = cur->right;
            
            
// 改變左右子樹的父結點,不過要判斷cur是否為根結點
if(cur->left)
                cur
->left->par = tmp;
            
if(cur->right)
                cur
->right->par = tmp;
        }

        
elseif(cur->left) // 右子樹為空
            tmp = cur->left;
        
elseif(cur->right) // 左子樹為空
            tmp = cur->right;
        
else// 左右子樹皆為空,說明要刪除的是葉子結點
{
            (cur 
== cur->par->left) ? (cur->par->left = NULL) :(cur->par->right = NULL);
            isleave 
=true;
        }


        
if(!isleave)
        
{
            tmp
->par = cur->par;

            
if(cur->par)
                (cur 
== cur->par->left) ? (cur->par->left = tmp) :(cur->par->right = tmp);
            
            
if(root == cur)
            
{
                root 
= tmp;
                root
->par = NULL;
            }

        }

    }


    delete cur;

    
returntrue;

相關推薦

C++實現一個

/**//** 昨天參加宜搜的筆試,要求用C++寫一二叉樹類,實現插入,刪除,定位功能,輾轉再三,* 卻無從下手,甚急,終基礎不好,今天再想,通過層次遍歷二叉樹,再進行實現相關功能* 實也不難. 以下程式碼*//**//** FileName:BTree.cpp* Description:binary tre

Python實現一個

最近在學習Python,之前只是在寫指令碼,做一些資料處理的工作,今天開始看Python的面向物件,熟悉了語法之後,想實現一個二叉樹類練練手。 以前寫C++比較多,用Python寫二叉樹好不習慣,沒有指標,沒有引用!!! 所以我就遇到了一下幾個問題: 1、該怎麼把二叉樹各

Java實現一個

子節點 -o 分享 roo 添加 return 葉子節點 ont java實現 介紹 使用Java實現一個int值類型的排序二叉樹 二叉樹 二叉樹是一個遞歸的數據結構,每個節點最多有兩個子節點。 通常二叉樹是二分查找樹,每個節點它的值大於或者等於在它左子樹節點上的值,小於或

C# 實現一個

原文地址 http://www.cnblogs.com/ppchouyou/archive/2008/07/18/1245819.html 昨天用C#寫了一個二叉樹的類,包括如何構造二叉樹的根節點,向二叉樹中插入一個節點順便實現了一下二叉樹的四種遍歷方法:前序,中序,後序

C語言將轉換為雙向連結串列

樹是一種重要的資料結構,尤其是二叉樹。二叉樹的用處比較廣泛,用得最多的樹就是二叉樹。 二叉樹的每個結點最多有兩個子結點,左邊的一般稱為左孩子,右邊的稱為右孩子。根節點兩邊 的稱為左子樹和右子樹。二叉樹

C/C++實現平衡的插入、刪除、查詢和各種遍歷

1 平衡二叉樹的插入      關於平衡二叉樹的定義什麼的,就不再多說。直接說說各種功能的c語言實現。 首先插入的時候需要進行旋轉以保證樹始終保持平衡。而旋轉的型別有四種:L-L型旋轉,L-R型旋轉,R-L型旋轉,R-R型旋轉。其中L-L型和R-R型只需要進行一次基本旋轉操作

使用c++構建一個

The binary tree is a fundamental data structure used in computer science. The binary tree is a useful data structure for rapidly storing

c/c++實現利用的先序遍歷和中序遍歷序列重建樹

先序遍歷中第一個結點必然是根結點,利用該結點在中序遍歷中的位置,將樹分為左子樹和右子樹,然後遞迴重建左子樹和右子樹,程式碼如下#include <iostream> using names

C++實現搜尋

#define _CRT_SECURE_NO_WARNINGS 1 #include<iostream> #include<stdlib.h> using namespace std; template<class K,class V> struct BSTNode {

資料結構實驗6:C++實現

實驗6 學號:     姓名:      專業:   6.1 實驗目的 掌握二叉樹的動態連結串列儲存結構及表示。 掌握二叉樹的三種遍歷演算法(遞迴和非遞迴兩類)。 運用二叉樹三種遍歷的方法求解有關問題。 6

(Python)# 請實現一個函式,來判斷一顆是不是對稱的。注意,如果一個同此的映象是同樣的,定義其為對稱的.

# 請實現一個函式,用來判斷一顆二叉樹是不是對稱的。注意,如果一個二叉樹同此二叉樹的映象是同樣的,定義其為對稱的. class TreeNode: def __init__(self, x): self.val = x self.lef

日常學習隨筆-鏈表的形式實現普通的新增、查找、遍歷(前、中、後序)等基礎功能(側重源碼+說明)

新增 rabl super 例子 信息 count TP title 處理 一、二叉樹 1、二叉樹的概念 二叉樹是每個節點最多有兩個子樹的樹結構。通常子樹被稱作“左子樹”(left subtree)和“右子樹”(right subtree),其次序不能任意顛倒。 2、性質

[原始碼和文件分享]基於C++實現排序

一、使用說明 1.1 專案簡介 依次輸入關鍵字並建立二叉排序樹,實現二叉排序樹的插入和查詢功能。 1.2 專案功能要求 二叉排序樹就是指將原來已有的資料根據大小構成一棵二叉樹,二叉樹中的所有結點資料滿足一定的大小關係,所有的左子樹中的結點均比根結點小,所有的右子樹的結點均比根結點大。

C++模板實踐()1

先貼上我程式碼(未成品,我就先寫了構造和析構,先序遍歷程式碼),需要用的人可以直接用。 造輪子方便我去了解STL,瞭解程式碼。 我寫程式碼時踩過的一些小坑,作為一些小知識: 發生了幾個語法,編譯,連結bug。 第一個:模板的typedef,得宣告型別:typedef

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

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

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

//AVL(自動平衡二叉樹) #include <stdio.h> #include <stdlib.h> typedef int ElemType; //每個結點的平均值 typedef enum {      EH = 0,      LH =

C語言線索實現

        線索二叉樹的主要操作,包含:以p為根節點的子樹中序線索化,帶頭結點的二叉樹中序線索化和遍歷線索二叉樹這幾個函式。         下面講一下實現程式碼:                    首先,依然是型別定義,並宣告一個全域性變數pre: typed

演算法的樂趣c/c++ —— 2.2 實現

宣告:參考書籍《演算法筆記》 作者:作者: 胡凡 / 曾磊  出版社: 機械工業出版社   ISBN: 9787111540090 二叉樹其實是特殊的連結串列,是每個節點有一個數據域,兩個指標。而連結串列只有一個數據,一個指標。關於二叉樹可以參考博文二叉樹就是這麼簡單。我們現

劍指offer66題--Java實現c++實現和python實現 24.中和為某一值的路徑

題目描述 輸入一顆二叉樹的跟節點和一個整數,打印出二叉樹中結點值的和為輸入整數的所有路徑。路徑定義為從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。(注意: 在返回值的list中,陣列長度大的陣列靠前) C++ /* struct TreeNode { int val; s

劍指offer66題--Java實現c++實現和python實現 18.的映象

題目描述 操作給定的二叉樹,將其變換為源二叉樹的映象。 輸入描述: 二叉樹的映象定義:源二叉樹 8 / \ 6 10 / \ / \ 5 7 9 11 映象二叉樹 8