递归实现
#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;
}