[1]输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表

输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。
要求不能创建任何新的结点,只调整指针的指向。
          10
        /     \
       6     14
      / \     /  \
     4  8 12  16
转换成双向链表
4=6=8=10=12=14=16

解:

二元查找树: 它首先要是一棵二元树,在这基础上它或者是一棵空树;或者是具有下列性质的二元树:

(1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;

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

(3)左、右子树也分别为二元查找树

/**
* 1:构造二叉查找树;
* 2:中序遍历二叉查找树,因此结点按从小到大顺序访问,
*    假设之前访问过的结点已经调整为一个双向链表,那么
*    只需要将当前结点连接至双向链表的最后一个结点即可,
*    访问完后,双向链表也就调整完了
*
*/
#include <stdio.h>

//      10
//    /   //   6    14
//  / \  /  // 4  8 12  16

struct BSTreeNode
{
    int m_nValue;
    BSTreeNode *m_pLeft;
    BSTreeNode *m_pRight;
};

typedef BSTreeNode DoubleList;
DoubleList * pHead;
DoubleList * pListIndex;
static int i;

/* 建立二叉排序树 */
void addBSTreeNode(BSTreeNode *&pCurrent, int value)
{
    if(pCurrent == NULL)
    {
        BSTreeNode *pBSTree = new BSTreeNode();
        pBSTree->m_nValue   = value;
        pBSTree->m_pLeft    = NULL;
        pBSTree->m_pRight   = NULL;
        pCurrent            = pBSTree;
    }
    else if(pCurrent->m_nValue < value)
    {
        addBSTreeNode(pCurrent->m_pRight, value);
    }
    else if(pCurrent->m_nValue > value)
    {
        addBSTreeNode(pCurrent->m_pLeft, value);
    }
    else
    {
        printf("Node repeated.\n");
    }
}

void Mid_Walk_Tree(BSTreeNode *pRoot)
{
    if(pRoot != NULL)
    {
        if(NULL != pRoot->m_pLeft)
        {
            Mid_Walk_Tree(pRoot->m_pLeft);
        }

        printf("%d ", pRoot->m_nValue);

        if(NULL != pRoot->m_pRight)
        {
            Mid_Walk_Tree(pRoot->m_pRight);
        }
    }
}

void ConvertToDoubleList(BSTreeNode *pCurrent)
{
    pCurrent->m_pLeft = pListIndex;
    if(NULL != pListIndex)
    {
        pListIndex->m_pRight = pCurrent;
    }
    else
    {
        pHead = pCurrent;
    }
    pListIndex = pCurrent;
    printf("pCurrent->m_nValue = %d\n", pCurrent->m_nValue);
}

/* 中序遍历二叉树,同时调整结点指针 */
void inOrderBSTree(BSTreeNode* pBSTree)
{

    if(NULL == pBSTree)
    {
        return;
    }

    if(NULL != pBSTree->m_pLeft)
    {
        inOrderBSTree(pBSTree->m_pLeft);
    }

    printf("i = %d\n", i);

    ConvertToDoubleList(pBSTree);

    if(NULL != pBSTree->m_pRight)
    {
        inOrderBSTree(pBSTree->m_pRight);
    }
    i++;
}

int main()
{
    BSTreeNode *pRoot = NULL;
    addBSTreeNode(pRoot, 10);
    addBSTreeNode(pRoot, 6);
    addBSTreeNode(pRoot, 14);
    addBSTreeNode(pRoot, 4);
    addBSTreeNode(pRoot, 8);
    addBSTreeNode(pRoot, 12);
    addBSTreeNode(pRoot, 16);

    //Mid_Walk_Tree(pRoot);

    inOrderBSTree(pRoot);

    return 0;
}
时间: 2024-09-30 01:59:50

[1]输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表的相关文章

二元查找树转换成一个排序的双向链表

输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表.要求不能创建任何新的结点,只调整指针的指向. 最直观的一种思路就是每次从二分查找树中找到最小的数,加到链表中 </pre><pre name="code" class="cpp">// BST2list.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> using namesp

输入一棵二叉搜索树,现在要将该二叉搜索树转换成一个排序的双向链表。

一.问题描述 输入一棵二叉搜索树,现在要将该二叉搜索树转换成一个排序的双向链表.而且在转换的过程中,不能创建任何新的结点,只能调整树中的结点指针的指向来实现. 二.实现思路 在二叉搜索树中,每个结点都有两个分别指向其左.右子树的指针,左子树结点的值总是小于父结点的值,右子树结点的值总是大于父结点的值.而在双向链表中,每个结点也有两个指针,它们分别指向前一个结点和后一个结点.所以这两种数据结构的结点是一致,二叉搜索树之所以为二叉搜索树,双向链表之所以为双向链表,只是因为两个指针的指向不同而已 思路

二元查找树转化成排序的双向链表——要求不创建新的节点

码完第一次编译运行居然就成功了...高兴~ 问题描述: 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表.要求不能创建任何新的结点,只调整指针的指向.例如: 10 /    \ 6     14 / \      /  \ 4   8  12  16 转换成双向链表 4=6=8=10=12=14=16 算法: 如果没有"不能创建任何新的结点"的限制,只需进行一次中序遍历,对每个节点的data值构造一个新节点即可. 由于条件限制,现在我们只能用现有的节点,调整他们的指针指向,把

Java实现: 把二元查找树转变成排序的双向链表(树)

题目 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表.要求不能创建任何新的结点,只调整指针的指向. 10 /    \ 6      14 /   \     /   \ 4    8  12   16 转换成双向链表4=6=8=10=12=14=16. 首先我们定义的二元查找树 节点的数据结构如下: struct BSTreeNode{ int m_nValue; // value of node BSTreeNode *m_pLeft;// left child of node

算法-1.把二元查找树转变成排序的双向链表

输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表. 要求不能创建任何新的结点,只调整指针的指向. 如下图.    10 /\ 6    14 /\     /\ 4 8 12 16 转换成双向链表 4=6=8=10=12=14=16. 这是一种二叉树的中序遍历. typedef struct BSTreeNode { int data; struct BSTreeNode *m_pLeft; struct BSTreeNode *m_pRight; }BSTreeNode,*pBSTr

MS - 把二元查找树转变成排序的双向链表

## 1. 把二元查找树转变成排序的双向链表 ## ### 题目: 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表. ### 要求不能创建任何新的结点,只调整指针的指向. 10        /   \       6     14      /  \  /  \     4   8 12  16  转换成双向链表 4=6=8=10=12=14=16. 首先我们定义的二元查找树节点的数据结构如下: 1 struct BSTreeNode 2 { 3 int m_nValue; //

1.把二元查找树转变成排序的双向链表

转载请注明出处:http://www.cnblogs.com/wuzetiandaren/p/4256355.html  声明:现大部分文章为寻找问题时在网上相互转载,此博是为自己做个记录记录,方便自己也方便有类似问题的朋友,本文的思想也许有所借鉴,但源码均为本人实现,如有侵权,请发邮件表明文章和原出处地址,我一定在文章中注明.谢谢. 题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表.要求不能创建任何新的结点,只调整指针的指向. 题目分析: 1.二叉树的节点有左右孩子指针,而双向

【编程题目】把二元查找树转变成排序的双向链表(树)

1.把二元查找树转变成排序的双向链表(树)题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表.要求不能创建任何新的结点,只调整指针的指向. 10 / \ 6 14 / \ / \ 4 8 12 16转换成双向链表4=6=8=10=12=14=16.首先我们定义的二元查找树 节点的数据结构如下:struct BSTreeNode{int m_nValue; // value of nodeBSTreeNode *m_pLeft; // left child of nodeBSTree

28、输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)

题目描述 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 思路:  1.当Tree1和Tree2都不为零的时候,才进行比较.否则直接返回false  2. 2.1如果找到了对应Tree2的根节点的点, 以这个根节点为为起点判断是否包含Tree2 2.2 如果找不到,那么就再去root的左孩子当作起点,去判断时候包含Tree22.3 如果还找不到,那么就再去root的右孩子当作起点,去判断时候包含Tree2 1 public class Solution