二叉树-单度节点的删除

断了今生、忘了曾经 提交于 2019-11-25 19:28:34

递归实现(不带父亲指针)

#include <iostream>
#include "BTree.h"

using namespace std;
using namespace DTlib;

template < typename T >
BTreeNode<T>* createTree()
{
    static BTreeNode<int> ns[9];

    for(int i=0; i<9; i++)
    {
        ns[i].value = i;
        ns[i].parent = NULL;
        ns[i].left = NULL;
        ns[i].right = NULL;
    }

    ns[0].left = &ns[1];
    ns[0].right = &ns[2];
    ns[1].parent = &ns[0];
    ns[2].parent = &ns[0];

    ns[1].left = &ns[3];
    ns[1].right = NULL;
    ns[3].parent = &ns[1];

    ns[2].left = &ns[4];
    ns[2].right = &ns[5];
    ns[4].parent = &ns[2];
    ns[5].parent = &ns[2];

    ns[3].left = NULL;
    ns[3].right = &ns[6];
    ns[6].parent = &ns[3];

    ns[4].left = &ns[7];
    ns[4].right = NULL;
    ns[7].parent = &ns[4];

    ns[5].left = &ns[8];
    ns[5].right = NULL;
    ns[8].parent = &ns[5];

    return ns;
}

template < typename T >
void printInOrder(BTreeNode<T>* node)
{
    if(node != NULL)
    {
        printInOrder(node->left);

        cout << node->value << " ";

        printInOrder(node->right);
    }
}

template < typename T >
void delOdd2(BTreeNode<T>*& node)
{
    if(node != NULL)
    {
        if((node->left && !node->right)||(!node->left && node->right))
        {
            BTreeNode<T>* node_child = (node->left != NULL) ? node->left : node->right;//指向单度结点的唯一孩子

            if(node->flag())
            {
                delete node;
            }

            node = node_child;

            delOdd2(node);
        }
        else
        {
            delOdd2(node->left);
            delOdd2(node->right);
        }
    }
}


int main()
{
    BTreeNode<int>* ns = createTree<int>();

    printInOrder(ns);

    cout << endl;

    delOdd2(ns);

    printInOrder(ns);

    cout << endl;

    return 0;
}

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!