/*
* -*- coding: utf-8 -*-
* micro.cpp
*
* Created on: 2014年3月31日
* Author: szk
* todo:算法第1题-BSTtreeToDoubleList
*/
// 1. 定义BST树节点node的结构;
// 2. 创建BST树;
// 3. 遍历BST;
// 4. bst转成list;
#include <iostream>
using namespace std;
struct BSTtreeNode{
int value;
BSTtreeNode *left;
BSTtreeNode *right;
};
BSTtreeNode *head;
BSTtreeNode *pIndex;
void createBSTtreeNode(BSTtreeNode *¤tNode, int value)
{
if (currentNode == NULL)
{
BSTtreeNode *pBTree = new BSTtreeNode();
pBTree->value = value;
pBTree->left = NULL;
pBTree->right = NULL;
currentNode = pBTree;
}
else
{
if(currentNode->value > value)
{
createBSTtreeNode(currentNode->left, value);
}
else if(currentNode->value < value)
{
createBSTtreeNode(currentNode->right, value);
}
else
cout << "输入重复节点" << endl;
}
}
void addToDupList(BSTtreeNode *currentNode)
{
BSTtreeNode *tmpNode = NULL;
tmpNode = currentNode;
if(head == NULL)
{
head = tmpNode;
pIndex= head;
}
else
{
pIndex->right = tmpNode;
tmpNode->left = pIndex;
pIndex = tmpNode;
}
cout << pIndex->value << endl;
}
void InOrderReverseBSTtree(BSTtreeNode *currentNode)
{
if(currentNode)
{
InOrderReverseBSTtree(currentNode->left);
addToDupList(currentNode);
InOrderReverseBSTtree(currentNode->right);
}
}
void testBSTtreeToDoubleList()
{
BSTtreeNode *root = NULL;
head = NULL;
pIndex = NULL;
createBSTtreeNode(root, 10);
createBSTtreeNode(root, 4);
createBSTtreeNode(root, 6);
createBSTtreeNode(root, 8);
createBSTtreeNode(root, 12);
createBSTtreeNode(root, 14);
createBSTtreeNode(root, 15);
createBSTtreeNode(root, 16);
InOrderReverseBSTtree(root);
}
int main(void)
{
testBSTtreeToDoubleList();
return 0;
这个算法从思路上来讲比较简单,因为要生成结果是有序的双向链表有没有告诉不允许新开空间所以最简单的思路莫过于:中序遍历bst树,每输出一个节点便将其添加到双向链表中。
1. BST树转化为双向链表
最新推荐文章于 2024-07-21 15:37:58 发布