二叉树之方法实现

1、二叉树上的操作

        均是C++实现先根序创建二叉树及其其它方法

我认为在二叉树的创建方法和遍历以外,以下方法值得我们关注:

public:
    int size()const;  //求结点个数
    int height()const;  //求树的高度
    BinTreeNode<Type>* root_1()const; //求根节点
    BinTreeNode<Type>* leftChild(BinTreeNode<Type>* cur)const;  //求当前结点的左孩子
    BinTreeNode<Type>* rightChild(BinTreeNode<Type>* cur)const; //求当前结点的右孩子
    BinTreeNode<Type>* find(const Type &key)const;              //查找当前结点
    BinTreeNode<Type>* parent(BinTreeNode<Type>* cur)const;     //查找当前结点的父结点
    void makeEmpty();                                           //将二叉树置空
    bool equal(const BinTree<Type> &t)const;                    //两个二叉树是否相同的比较
    BinTreeNode<Type>* copy(BinTreeNode<Type> *t)const;         //拷贝构造函数的方法,复制一个二叉树

2、方法一一实现:

(1)、求结点个数

template<typename Type>
int BinTree<Type>::size(BinTreeNode<Type> *t)const{
    if(t == NULL){
        return 0;
    }

    return size(t->leftChild) + size(t->rightChild) + 1;
}

(2)、求树的高度

template<typename Type>
int BinTree<Type>::height(BinTreeNode<Type> *t)const{
    if(t == NULL){
        return 0;
    }
    int leftHeight = height(t->leftChild);
    int rightHeight = height(t->rightChild);

    return (leftHeight > rightHeight ? leftHeight : rightHeight) + 1;
}

(3)、查找当前结点

template<typename Type>
BinTreeNode<Type>* BinTree<Type>::find(const Type &key, BinTreeNode<Type> *t)const{
    if(t == NULL){
        return NULL;
    }
    if(t->data == key){
        return t;
    }

    BinTreeNode<Type> *p = find(key, t->leftChild);
    if(p != NULL){
        return p;
    }

    return find(key, t->rightChild);
}

(4)、查找当前结点的父结点

template<typename Type>
BinTreeNode<Type>* BinTree<Type>::parent(BinTreeNode<Type>* cur, BinTreeNode<Type> *t)const{
    if(t == NULL || cur == NULL || cur == t){
        return NULL;
    }
    if(t->leftChild == cur || t->rightChild == cur){
        return t;
    }        //思路:利用父的孩子节点和当前节点比较
    BinTreeNode<Type> *p = parent(cur, t->leftChild);
    if(p != NULL){
        return p;
    }

    return parent(cur, t->rightChild);
}

(5)、将二叉树置空

template<typename Type>
void BinTree<Type>::makeEmpty(BinTreeNode<Type> *t){
    if(t != NULL){
        makeEmpty(t->leftChild);
        makeEmpty(t->rightChild);
        delete t;
    }
}

(6)、两个二叉树是否相同的比较

template<typename Type>
bool BinTree<Type>::equal(BinTreeNode<Type> *t, BinTreeNode<Type> *t1)const{
    if(t == NULL && t1 == NULL){  //取反判断与这个是一个道理
        return true;
    }
    if(t != NULL && t1!= NULL && t->data == t1->data && equal(t->leftChild, t1->leftChild)
        && equal(t->rightChild, t1->rightChild)){
        return true;
    }else{

        return false;
    }
}

(7)、拷贝一个二叉树

template<typename Type>
BinTreeNode<Type>* BinTree<Type>::copy(BinTreeNode<Type> *t)const{
    BinTreeNode<Type>* tmp;

    if(t == NULL){
        return NULL;
    }else{
        tmp = new BinTreeNode<Type>(t->data);
        tmp->leftChild = copy(t->leftChild);
        tmp->rightChild = copy(t->rightChild);
    }

    return tmp;
}

以上的这些方法都是利用二叉树的性质递归实现,比较好想清楚,就不做解释了,实在有问题,画画图就会好很多。

3、二叉树的所有方法,测试,及测试结果如下:

(1)、所有关于二叉树的代码:

#ifndef _BIN_TREE_H_
#define _BIN_TREE_H_

#include<iostream>
#include<stack>  //非递归遍历引入栈
#include<queue>  //层次遍历引入队列
using namespace std;

template<typename Type> //为的是声明友元类,调用BinTreeNode<Type>的私有数据
class BinTree;

template<typename Type>  //BinTreeNode类
class BinTreeNode{   
    friend class BinTree<Type>;
public:
    BinTreeNode() : data(Type()), leftChild(NULL), rightChild(NULL){}
    BinTreeNode(Type value, BinTreeNode<Type> *left = NULL, BinTreeNode<Type> *right = NULL) :
    data(value), leftChild(left), rightChild(right){}
    ~BinTreeNode(){}
private:
    Type data;
    BinTreeNode *leftChild;
    BinTreeNode *rightChild;
};
///////////////////////////////////////////////////////////////////////////////
template<typename Type>   //BinTree类
class BinTree{
public:
    BinTree() : root(NULL){}
    BinTree(Type ref) : root(NULL), refval(ref){}
    BinTree(const BinTree &t){
        root = copy(t.root);  //调用拷贝方法
    }
    ~BinTree(){
        makeEmpty();  //析构函数这里将二叉树置空
        root = NULL;    
    }
public:                 //创建二叉树
    void createBinTree();
    void createBinTree(const char *str);
    void createBinTree(const char *VLR, const char *LVR, int n);
    void createBinTree_1(const char *LVR, const char *LRV, int n);
public:                //递归遍历
    void prevOrder()const;
    void inOrder()const;
    void endOrder()const;
public:               //各种方法的声明
    int size()const;
    int height()const;
    BinTreeNode<Type>* root_1()const; //以下的三个方法比较简单,就不在进行调用保护方法了;
    BinTreeNode<Type>* leftChild(BinTreeNode<Type>* cur)const;
    BinTreeNode<Type>* rightChild(BinTreeNode<Type>* cur)const;
    BinTreeNode<Type>* find(const Type &key)const;
    BinTreeNode<Type>* parent(BinTreeNode<Type>* cur)const;
    void makeEmpty();
    bool equal(const BinTree<Type> &t)const;
    BinTreeNode<Type>* copy(BinTreeNode<Type> *t)const;
public:              //非递归遍历
    void prevOrder_1()const;
    void inOrder_1()const;
    void endOrder_1()const;
    void levelOrder()const; //puublic:供外界提供的接口,
////////////////////////////////////////////////////////////////////////////////
protected:                 //protected:供自己函数内部调用,写保护方法
    void prevOrder_1(BinTreeNode<Type>* t)const;
    void inOrder_1(BinTreeNode<Type>* t)const;
    void endOrder_1(BinTreeNode<Type>* t)const;
    void levelOrder(BinTreeNode<Type>* t)const;
protected:
    int size(BinTreeNode<Type> *t)const;
    int height(BinTreeNode<Type> *t)const;
    BinTreeNode<Type>* find(const Type &key, BinTreeNode<Type> *t)const;
    BinTreeNode<Type>* parent(BinTreeNode<Type>* cur, BinTreeNode<Type> *t)const;
    void makeEmpty(BinTreeNode<Type>* t);
    bool equal(BinTreeNode<Type> *t, BinTreeNode<Type> *t1)const;
protected:
    void prevOrder(BinTreeNode<Type> *t)const;
    void inOrder(BinTreeNode<Type> *t)const;
    void endOrder(BinTreeNode<Type> *t)const;
protected :
    void createBinTree(BinTreeNode<Type> *&t);
    BinTreeNode<Type>* createBinTree_1();
    void createBinTree(const char *&str, BinTreeNode<Type> *&t);
    BinTreeNode<Type>* createBinTree_1(const char *&str);
    void createBinTree(BinTreeNode<Type> *&t, const char *VLR, const char *LVR, int n);
    void createBinTree_1(BinTreeNode<Type> *&t, const char *LVR, const char *LRV, int n);
                         //以上都只是在类内声明;
private:
    BinTreeNode<Type> *root;
    Type               refval;  //‘#‘
};
///////////////////////////////////////////////////////////////////////////////
template<typename Type>  //类外实现公有方法的调用
void BinTree<Type>::createBinTree(){  //创建二叉树
    //createBinTree(root);
    root = createBinTree_1();
}
template<typename Type>
void BinTree<Type>::prevOrder()const{ //先序递归遍历
    cout<<"先根序如下: "<<endl;
    prevOrder(root);
}
template<typename Type>
void BinTree<Type>::inOrder()const{ //中序递归遍历
    cout<<"中根序如下: "<<endl;
    inOrder(root);
}
template<typename Type>
void BinTree<Type>::endOrder()const{  //后序递归遍历
    cout<<"后根序如下: "<<endl;
    endOrder(root);
}

template<typename Type>
void BinTree<Type>::createBinTree(const char *str){ //创建二叉树
//    createBinTree(str, root);
    root = createBinTree_1(str);
}
template<typename Type>
int BinTree<Type>::size()const{  //求结点个数
    return size(root);
}
template<typename Type>
int BinTree<Type>::height()const{ //求树的高度
    return height(root);
}
template<typename Type>
BinTreeNode<Type>* BinTree<Type>::root_1()const{ //求根节点
    return root;
}
template<typename Type>
BinTreeNode<Type>* BinTree<Type>::leftChild(BinTreeNode<Type>* cur)const{ //求当前结点的左孩子
    return cur->leftChild;
}
template<typename Type>
BinTreeNode<Type>* BinTree<Type>::rightChild(BinTreeNode<Type>* cur)const{  //求当前结点的右孩子
    return cur->rightChild;
}
template<typename Type>
BinTreeNode<Type>* BinTree<Type>::find(const Type &key)const{  //查找当前结点
    return find(key, root);
}
template<typename Type>
BinTreeNode<Type>* BinTree<Type>::parent(BinTreeNode<Type>* cur)const{ //查找当前结点的父结点
    return parent(cur, root);
}
template<typename Type>
void BinTree<Type>::makeEmpty(){ //将二叉树置空
    makeEmpty(root);
}
template<typename Type>
bool BinTree<Type>::equal(const BinTree<Type> &t)const{ //两个二叉树是否相同的比较
    return equal(t.root, root);
}
template<typename Type>
void BinTree<Type>::prevOrder_1()const{  //非递归先序
    prevOrder_1(root);
}
template<typename Type>
void BinTree<Type>::inOrder_1()const{   //非递归中序
    inOrder_1(root);
}
template<typename Type>
void BinTree<Type>::endOrder_1()const{   //非递归后序
    endOrder(root);
}
template<typename Type>
void BinTree<Type>::levelOrder()const{   //层次遍历
    levelOrder(root);
}
template<typename Type>
void BinTree<Type>::createBinTree(const char *VLR, const char *LVR, int n){ //创建二叉树
    createBinTree(root, VLR, LVR, n);
}
template<typename Type> 
void BinTree<Type>::createBinTree_1(const char *LVR, const char *LRV, int n){ //创建二叉树
    createBinTree_1(root, LVR, LRV, n);
}
//////////////////////////////////////////////////////////////////////////////////////////
template<typename Type>  //以下的都是写保护的方法,供自己使用
void BinTree<Type>::createBinTree_1(BinTreeNode<Type> *&t, const char *LVR, const char *LRV, int n){  //中序和后序创建二叉树
    if(n == 0){
        t = NULL;
        return;
    }
    int k = 0;
    while(LVR[k] != LRV[n-1]){
        k++;
    }
    t = new BinTreeNode<Type>(LVR[k]);
    
    createBinTree_1(t->rightChild, LVR+k+1, LRV+k, n-k-1);
    createBinTree_1(t->leftChild, LVR, LRV, k);
}
template<typename Type>
void BinTree<Type>::createBinTree(BinTreeNode<Type> *&t, const char *VLR, const char *LVR, int n){   //先序和中序创建二叉树
    if(n == 0){
        t = NULL;
        return;
    }
    int k = 0;
    while(LVR[k] != VLR[0]){
        k++;
    }
    t = new BinTreeNode<Type>(LVR[k]);
    createBinTree(t->leftChild, VLR+1, LVR, k);
    createBinTree(t->rightChild, VLR+k+1, LVR+k+1, n-k-1);
}
template<typename Type>
void BinTree<Type>::levelOrder(BinTreeNode<Type>* t)const{  //层次遍历
    queue<BinTreeNode<Type> *> qu;
    BinTreeNode<Type> *p;

    if(t != NULL){
        qu.push(t);
        while(!qu.empty()){
            p = qu.front();
            qu.pop();
            cout<<p->data<<" ";
            if(p->leftChild){
                qu.push(p->leftChild);
            }
            if(p->rightChild){
                qu.push(p->rightChild);
            }
        }
    }
}
typedef enum{L, R}Tag;
template<typename Type>
class stkNode{
public:
    stkNode(BinTreeNode<Type> *p = NULL) : ptr(p), tag(L){}
public:
    BinTreeNode<Type> *ptr;
    Tag                   tag; //L R
};
template<typename Type>
void BinTree<Type>::endOrder_1(BinTreeNode<Type>* t)const{  //非递归后序
    stkNode<Type> n;
    stack<stkNode<Type>> st;
    BinTreeNode<Type> *p = t;
    
    do{
        while(p != NULL){
            n.ptr = p;
            n.tar = L;
            st.push(n);
            p = p->leftChild;
        }
        bool isRun = true;
        while(isRun && !st.empty()){
            n = st.top();
            st.pop();

            switch(n.tag){
            case L:
                p = n.ptr;
                n.tag = R;
                st.push(n);
                p = p->rightChild;
                isRun = false;
                break;
            case R:
                cout<<n.ptr->data<<" ";
                break;
            }
        }
    }while(!st.empty());//不用p1=NULL,因为当栈空时,最后一个节点刚好被访问完成。
}
template<typename Type>
void BinTree<Type>::inOrder_1(BinTreeNode<Type>* t)const{  //非递归中序
    stack<BinTreeNode<Type> *> st;
    BinTreeNode<Type> *p = t;

    do{
        while(p != NULL){
            st.push(p);
            p = p->leftChild;
        }
        if(!st.empty()){
            p = st.top();
            st.pop();
            cout<<p->data<<" ";
            p = p->rightChild;
        }//中序遍历时,当root出栈时,此时占空,
    }while(p != NULL || !st.empty()); //为根的时候右边还要入栈。
}

template<typename Type>
void BinTree<Type>::prevOrder_1(BinTreeNode<Type>* t)const{  //非递归先序
    stack<BinTreeNode<Type> *> st;
    BinTreeNode<Type> *tmp;

    if(t != NULL){
        st.push(t);
        while(!st.empty()){
            tmp = st.top();
            st.pop();
            cout<<tmp->data<<" ";
            if(tmp->rightChild){
                st.push(tmp->rightChild);
            }
            if(tmp->leftChild){
                st.push(tmp->leftChild);
            }
        }
    }
}
template<typename Type>
BinTreeNode<Type>* BinTree<Type>::copy(BinTreeNode<Type> *t)const{  //拷贝函数
    BinTreeNode<Type>* tmp;

    if(t == NULL){
        return NULL;
    }else{
        tmp = new BinTreeNode<Type>(t->data);
        tmp->leftChild = copy(t->leftChild);
        tmp->rightChild = copy(t->rightChild);
    }

    return tmp;
}
template<typename Type>
bool BinTree<Type>::equal(BinTreeNode<Type> *t, BinTreeNode<Type> *t1)const{  //两个二叉树是否相同的比较
    if(t == NULL && t1 == NULL){  //取反判断与这个是一个道理
        return true;
    }
    if(t != NULL && t1!= NULL && t->data == t1->data && equal(t->leftChild, t1->leftChild)
        && equal(t->rightChild, t1->rightChild)){
        return true;
    }else{

        return false;
    }
}
template<typename Type>
void BinTree<Type>::makeEmpty(BinTreeNode<Type> *t){  //将二叉树置空
    if(t != NULL){
        makeEmpty(t->leftChild);
        makeEmpty(t->rightChild);
        delete t;
    }
}
template<typename Type>
BinTreeNode<Type>* BinTree<Type>::parent(BinTreeNode<Type>* cur, BinTreeNode<Type> *t)const{  //查找当前结点的父结点
    if(t == NULL || cur == NULL || cur == t){
        return NULL;
    }
    if(t->leftChild == cur || t->rightChild == cur){
        return t;
    }        //思路:利用父的孩子节点和当前节点比较
    BinTreeNode<Type> *p = parent(cur, t->leftChild);
    if(p != NULL){
        return p;
    }

    return parent(cur, t->rightChild);
}
template<typename Type>
BinTreeNode<Type>* BinTree<Type>::find(const Type &key, BinTreeNode<Type> *t)const{   //查找当前结点
    if(t == NULL){
        return NULL;
    }
    if(t->data == key){
        return t;
    }

    BinTreeNode<Type> *p = find(key, t->leftChild);
    if(p != NULL){
        return p;
    }

    return find(key, t->rightChild);
}
template<typename Type>
int BinTree<Type>::height(BinTreeNode<Type> *t)const{  //求树的高度
    if(t == NULL){
        return 0;
    }
    int leftHeight = height(t->leftChild);
    int rightHeight = height(t->rightChild);

    return (leftHeight > rightHeight ? leftHeight : rightHeight) + 1;
}
template<typename Type>
int BinTree<Type>::size(BinTreeNode<Type> *t)const{  //求结点个数
    if(t == NULL){
        return 0;
    }

    return size(t->leftChild) + size(t->rightChild) + 1;
}
template<typename Type>
BinTreeNode<Type>* BinTree<Type>::createBinTree_1(const char *&str){  //创建二叉树
    BinTreeNode<Type> *t;

    if(refval == *str){
        t = NULL;
    }else{
        t = new BinTreeNode<Type>(*str);
        t->leftChild = createBinTree_1(++str);
        t->rightChild = createBinTree_1(++str);
    }
    return t;
}

template<typename Type>
void BinTree<Type>::createBinTree(const char *&str, BinTreeNode<Type> *&t){  //创建二叉树
    if(*str == refval){
        t = NULL;
    }else{
        t = new BinTreeNode<Type>(*str);
        createBinTree(++str, t->leftChild);  //前加,后加不一样!!!在这里,就是传引用,保证每次字符串都是往后走的
        createBinTree(++str, t->rightChild);
    }
}
template<typename Type>
BinTreeNode<Type>* BinTree<Type>::createBinTree_1(){  //创建二叉树
    Type createData;
    cin>>createData;
    BinTreeNode<Type> *t;

    if(refval == createData){
        t = NULL;
    }else{
        t = new BinTreeNode<Type>(createData);
        t->leftChild = createBinTree_1();
        t->rightChild = createBinTree_1();
    }

    return t;
}
template<typename Type>
void BinTree<Type>::endOrder(BinTreeNode<Type> *t)const{  //后序递归遍历
    if(t == NULL){
        return;
    }else{
        endOrder(t->leftChild);
        endOrder(t->rightChild);
        cout<<t->data<<" ";
    }
}

template<typename Type> 
void BinTree<Type>::inOrder(BinTreeNode<Type> *t)const{  //中序递归遍历
    if(t == NULL){
        return;
    }else{
        inOrder(t->leftChild);
        cout<<t->data<<" ";
        inOrder(t->rightChild);
    }
}

template<typename Type>
void BinTree<Type>::prevOrder(BinTreeNode<Type> *t)const{  //先序递归遍历
    if(t == NULL){
        return;
    }else{
        cout<<t->data<<" ";
        prevOrder(t->leftChild);
        prevOrder(t->rightChild);
    }
}
//根据先根序创建二叉树
template<typename Type>
void BinTree<Type>::createBinTree(BinTreeNode<Type> *&t){  //创建二叉树
    Type createData;
    cin>>createData;

    if(refval == createData){
        t = NULL;
    }else{
        t = new BinTreeNode<Type>(createData);
        createBinTree(t->leftChild);
        createBinTree(t->rightChild);
    }
}

#endif

以上代码我采用折叠的方式进行写的。类外公有调用下面紧跟保护方法的实现;

(2)、测试代码

#include"BinTree.h"
//ABC##DE##F##G#H##
/*
先根序如下:
A B C D E F G H
中根序如下:
C B E D F A G H
后根序如下:
C E F D B H G A
*/
int main(void){
//    char *VLR = "ABCDEFGH";
//    char *LVR = "CBEDFAGH";
//    char *LRV = "CEFDBHGA";

//    BinTree<char> bt; //对象初始化不写‘#‘;
//    int n = strlen(VLR);
//    bt.createBinTree(VLR, LVR, n); //在这里创建二叉树不用‘#‘结束,因为是由先序和中序创建,不看结束标志‘#‘;
//    bt.createBinTree_1(LVR, LRV, n);
//    bt.prevOrder();
//    cout<<endl;

    //bt.createBinTree(VLR, LRV, n); 不能创建

/*
    BinTree<char> bt(‘#‘);
    char *str = "ABC##DE##F##G#H##";
//    char *str = "ABC##DE###G#H##";
    bt.createBinTree(str);
    BinTree<char> bt1(bt);
    bt1.levelOrder();
    cout<<endl;
    
*/
      
/*    
    
//    st.createBinTree();
    BinTree<char> bt(‘#‘);
    BinTree<char> bt1(‘#‘);
    char *str = "ABC##DE##F##G#H##";
    bt.createBinTree(str);
    bt1.createBinTree(str);  //构建的是一颗空树,引用传递构建,原先字符串已经为空!

    if(bt.equal(bt1)){
        cout<<"相等"<<endl;
    }else{
        cout<<"不相等"<<endl;
    }
*/    
    BinTree<char> bt(‘#‘);
    char *str = "ABC##DE##F##G#H##";
    bt.createBinTree(str);
    cout<<bt.size()<<endl;
    cout<<bt.height()<<endl;
    BinTreeNode<char> *p = bt.find(‘H‘);
    BinTreeNode<char> *t = bt.find(‘G‘);
    printf("%p\n", t);
    BinTreeNode<char> *q = bt.parent(p);
    printf("%p\n", q);

    bt.prevOrder();
    cout<<endl;
    bt.inOrder();
    cout<<endl;
    bt.endOrder();
    cout<<endl;
    
    return 0;
}

这是所有测试要用的代码,在编写时,写一个方法测试一个,将测试过的就注释起来了;

(3)、部分测试结果

至于其它的测试结果就不在给出了,有兴趣可以在测测其它的方法。

时间: 2024-10-19 17:29:15

二叉树之方法实现的相关文章

【转】更简单的非递归遍历二叉树的方法

解决二叉树的很多问题的方案都是基于对二叉树的遍历.遍历二叉树的前序,中序,后序三大方法算是计算机科班学生必写代码了.其递归遍历是人人都能信手拈来,可是在手生时写出非递归遍历恐非易事.正因为并非易事,所以网上出现无数的介绍二叉树非递归遍历方法的文章.可是大家需要的真是那些非递归遍历代码和讲述吗?代码早在学数据结构时就看懂了,理解了,可为什么我们一而再再而三地忘记非递归遍历方法,却始终记住了递归遍历方法? 三种递归遍历对遍历的描述,思路非常简洁,最重要的是三种方法完全统一,大大减轻了我们理解的负担.

二叉树遍历方法总结

1,   二叉树结构 struct TreeNode { int val; TreeNode* left; TreeNode* right; TreeNode(int x) : val(x), left(NULL), right(NULL) {} }; 2,   遍历方法 class BinaryTree { public: //二叉树的遍历 //递归遍历 //先序遍历 void preOrderTraversal( TreeNode* root ) { if(root) { cout <<

ip转发二叉树查找方法c实现

把以前网络课的最长前缀匹配的作业重新写了下.简单说一下,输入输出要求如下,详细要求可见课程页面:https://kattis.csc.kth.se/problem?id=forwarding2 1.路由表以fib <prefix> <interface>格式给出,以换行符结束 2.报文以input <16进制ascii码> 红色为以太报文头,蓝色为目的ip地址 Sample Input fib 10.1.0.0/24 e1 fib 10.2.0.0/24 e2 fib

二叉树的遍历方法

今天学习到二叉树的时候,看到了二叉树的先序,后序,中序遍历方法.然而二叉树遍历方法递归实现十分简单,迭代版本实现起来些许复杂,就又上手试试二叉树的各种遍历方法以及实现版本,当是温习一遍之前了解到的实现方法. 三种遍历方法中递归实现难度相当,代码相当简略. 三种遍历方法中利用栈实现的迭代版本中,先序和中序实现难度相对简单,但是后序遍历方法实现起来比较复杂,这里实现思路也不同于之前先序和中序的版本. 另外一种O(1)空间复杂度实现先序,中序实现难度也相对简单,后序相对复杂. 以下贴出完整测试代码,m

【算法日常】二叉树常用遍历方法

二叉树的遍历 本篇算一个资料整理,就是二叉树遍历方法,有先序遍历(PreOrder).中序遍历(InOrder).后序遍历(PostOrder).广度优先遍历二叉树(breadth_first_search).深度优先遍历(depth_first_search) 示例遍历二叉树: 二叉树节点格式: class TreeNode: def __init__(self, val): self.val = val self.left = self.right = None 1. 先序遍历 PreOrd

重构二叉树

重构二叉树 这是剑指offer中关于二叉树重构的一道题.题目原型为: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回. 一.二叉树的数据结构 做题之前,我们先熟悉下二叉树的数据结构.其一,定义:二叉树是一个连通的无环图,并且每一个顶点的度不大于3.有根二叉树还要满足根结点的度不大于2.有了根结点之后,每个顶点定

树和二叉树

以下的内容做为学习笔记,复制别人的,感觉总结的比较好: 第5章 树和二叉树 本章中主要介绍下列内容:  1.树的定义和存储结构  2.二叉树的定义.性质.存储结构  3.二叉树的遍历.线索算法  4.树和二叉树的转换  5.哈夫曼树及其应用课时分配:     1.2两个学时,3四个学时,4两个学时, 5两个学时,上机两个学时重点.难点:     二叉树的遍历.线索算法.哈夫曼树及其应用 第一节 树 1.树的定义和基本运算1.1 定义    树是一种常用的非线性结构.我们可以这样定义:树是n(n≥

数据结构学习笔记(树、二叉树)

树(一对多的数据结构) 树(Tree)是n(n>=0)个结点的有限集.n=0时称为空树.在任意一颗非空树种: (1)有且仅有一个特定的称为根(Root)的结点: (2)当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1.T2........Tn,其中每一个集合本身又是一棵树,并且称为根的子树. 对于树的定义还需要强调两点:1.n>0时根结点是唯一的,不可能存在多个根结点,数据结构中的树只能有一个根结点.2.m>0时,子树的个数没有限制,但它们一定是互不相交的. 结点

数据结构(C实现)------- 遍历二叉树

本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020 二叉树是另一中树型结构,它的特点是每个结点至多只有两棵子树(即二叉树中不存在度大于2的结点),并且,二叉树的子树有左右之分,其次序不能任意颠倒. 根据二叉树的的递归定义可知,二叉树是由3个基本单元组成,根结点.左子树和右子树,因此,若能依次遍历这三部分,便是遍历了整个二叉树.假如以L.D.R分别表示遍历左子树.访问根结点和遍历右子树,则可能有DLR.LDR.LRD.DRL.RD