二叉树-单度节点删除

递归实现

#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 >
BTreeNode<T>* delOdd1(BTreeNode<T>* node)
{
    BTreeNode<T>* ret = NULL;

    if(node != NULL)
    {
        if((node->left && !node->right)||(!node->left && node->right))
        {
            BTreeNode<T>* parent = dynamic_cast<BTreeNode<T>*>(node->parent);//node的父结点

            BTreeNode<T>* node_child = (node->left != NULL) ? node->left : node->right;//指向单度结点的唯一孩子

            if(parent != NULL)
            {
                BTreeNode<T>*& parent_child = (parent->left == node) ? parent->left : parent->right;//父结点中代表node的指针

                parent_child = node_child;
                node_child->parent = parent;
            }
            else //根结点为单度
            {
                node_child->parent = NULL;
            }

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

            ret = delOdd1(node_child);
        }
        else
        {
            delOdd1(node->left);
            delOdd1(node->right);

            ret = node;
        }
    }

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

    printInOrder(ns);

    cout << endl;

    ns = delOdd1(ns);

    printInOrder(ns);

    cout << endl;

    int a[] = {6,7,8};

    for(int i=0;i<3;i++)    //打印叶结点到根结点路径
    {
        TreeNode<int>* n = ns + a[i];

        while(n != NULL)
        {
            cout << n->value << " ";
            n = n->parent;
        }

        cout << endl;
    }

    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值