zoukankan      html  css  js  c++  java
  • 数据结构-用C++实现一个二叉树,递归方法中序遍历

    1:二叉排序树,又称二叉树。其定义为:二叉排序树或者空树,或者是满足如下性质的二叉树。

    (1)若它的左子树非空,则左子树上所有节点的值均小于根节点的值。

    (2)若它的右子树非空,则右子树上所有节点的值均大于根节点的值。

    (3)左、右子树本身又各是一颗二叉排序树。

        上述性质简称二叉排序树性质(BST性质),故二叉排序树实际上是满足BST性质的二叉树。

    2:代码如下:

    #include "stdafx.h"
    #include<malloc.h>
    #include <iostream>
    #include <assert.h>
    using namespace std;
    
    //定义节点类
    class Node
    {
    public:
        int data;//数据
        Node *parent;//父亲节点
        Node *left;//左子节点
        Node *right;//右子节点
    public:
        Node() :data(-1), parent(NULL), left(NULL), right(NULL) {};
        Node(int num) :data(num), parent(NULL), left(NULL), right(NULL) {};
    };
    
    //二叉排序树类定义
    class Tree
    {
    public:
        Tree(int num[], int len);//插入num数组的前len个数据
        void insertNode1(int data);//插入节点,递归方法
        void insertNode(int data);//插入节点,非递归方法
        //Node *searchNode(int data);//查找节点,递归方法
        void deleteNode(int data);//删除节点及其子树,递归方法
        void InOrderTree();//中序遍历,递归方法
        void InOrderTree(Node* current);//用于中序遍历,递归方法
        void PreOrderTreeUnRec();//中序遍历,非递归方法
    private:
        void insertNode(Node* current, int data);//递归插入方法
        Node *searchNode(Node* current, int data);//递归查找方法
        void deleteNode(Node* current);
    private:
        Node* root;//二叉树的根节点
    };
    
    //插入num数组的前len个数据
    Tree::Tree(int num[], int len)
    {
        root = new Node(num[0]);//建立root节点,为num[0]分配一个地址
        //把数组中的其他数组插入到二叉树中
        for (int i = 1; i < len; i++)
        {
            //insertNode(num[i]);
            insertNode1(num[i]);
        }
    }
    
    //插入数据为参数data的节点,非递归方法
    void Tree::insertNode1(int data)//插入节点
    {
        Node *p, *par;//p用于遍历节点,par用于保存节点
        Node *newNode = new Node(data);//创建节点
        p = par = root;
        while (p != NULL)//查找插入在哪个节点下面
        {
            par = p;//保存节点
            if (data > p->data)//如果data大于当前节点的data,下一步到左子节点,否则进行到右子节点
                p = p->right;
            else if (data < p->data)
                p = p->left;
            else if (data == p->data)//不能插入重复数据
            {
                delete newNode;
                return;
            }
        }
        newNode->parent = par;
        if (par->data > newNode->data)//把新节点插入在目标节点的正确位置
            par->left = newNode;
        else
            par->right = newNode;
    }
    
    //插入数据为参数data的节点,调用递归插入方法
    void Tree::insertNode(int data)
    {
        if (root != NULL)
        {
            insertNode(root, data);//调用递归插入方法
        }
    }
    
    //递归插入方法
    void Tree::insertNode(Node * current, int data)
    {
        //如果data小于当前节点数据,则在当前节点的左子树插入
        if (data < current->data)
        {
            if (current->left == NULL)//如果左节点不存在,则插入到左节点
            {
                current->left = new Node(data);
                current->left->parent = current;
            }
            else
                insertNode(current->left, data);//否则对左节点进行递归调用
        }
        //如果data大于当前节点数据,则在当前节点的右子树插入
        else if (data > current->data)
        {
            if (current->right == NULL)//如果右节点不存在,则插入到右节点
            {
                current->right = new Node(data);
                current->right->parent = current;
            }
            else
                insertNode(current->right, data);//否则对右节点进行递归调用
        }
        return;//data等于当前节点数据时,不插入
    }
    
    //递归查找方法
    Node *Tree::searchNode(Node* current, int data)
    {
        //如果data小于当前节点数据,则递归搜索左子树
        if (data < current->data)
        {
            if (current->left == NULL)//如果不存在左子树,则返回NULL
                return NULL;
            return searchNode(current->left, data);
        }
        //如果data大于当前节点数据,则递归搜索右子树
        else if (data > current->data)
        {
            if (current->right == NULL)//如果不存在右子树,则返回NULL
                return NULL;
            return searchNode(current->right, data);
        }
        //如果相等,则返回current
        return current;
    }
    
    //删除数据为data的节点及其子树
    void Tree::deleteNode(int data)
    {
        Node *current = NULL;
        //current = searchNode(data);//查找节点
        current = searchNode(current,data);//查找节点
        if (current != NULL)
        {
            //deleteNode(current);
            deleteNode(data);
        }
    }
    
    //删除current节点及其子树的所有节点
    void Tree::deleteNode(Node *current)
    {
        if (current->left != NULL)//删除左子树
        {
            deleteNode(current->left);
        }
        if (current->right != NULL)//删除右子树
        {
            deleteNode(current->left);
        }
        if (current->parent == NULL)//如果current是根节点,把root置空
        {
            delete current;
            root = NULL;
            return;
        }
        //将current父亲节点的相应指针置空
        if (current->parent->data > current->data)//current为其父节点的左子节点
            current->parent->left = NULL;
        else//current为parNode的右子节点
            current->parent->right = NULL;
        //最后删除此节点
        delete current;
    
    }
    
    //中序遍历,递归方法
    void Tree::InOrderTree()
    {
        if (root == NULL)
            return;
        InOrderTree(root);
    }
    //用于中序遍历
    void Tree::InOrderTree(Node* current)
    {
        if (current != NULL)
        {
            InOrderTree(current->left);//遍历左子树
            cout << current->data << " ";
            InOrderTree(current->right);//遍历右子树
        }
    }
    
    
    
    int main()
    {
        Node m_node(1);
        cout << "节点类的数据为:"<<m_node.data << endl;
        int num[] = { 5,3,7,2,4,6,8,1 };
        Tree tree(num, 8);
        cout << "InOrder:" << endl;
        tree.InOrderTree();//中序遍历,递归方法
        return 0;
    }
    View Code

  • 相关阅读:
    (OK) CORE nodes access Internet—虚拟节点访问互联网—commands
    Open VSwitch—离开VMware的SDN之父Martin Casado是神马大神
    (OK-half) Fedora23——Docker——CORE—testing
    【codeforces 752B】Santa Claus and Keyboard Check
    【codeforces 752C】Santa Claus and Robot
    【codeforces 752E】Santa Claus and Tangerines
    【codeforces 548E】Mike and Foam
    【codeforces 752D】Santa Claus and a Palindrome
    【codeforces 752F】Santa Clauses and a Soccer Championship
    【codeforces 546A】Soldier and Bananas
  • 原文地址:https://www.cnblogs.com/lovemi93/p/7609505.html
Copyright © 2011-2022 走看看