• 数据结构-二叉搜索树与双向链表


    题目:输入一颗二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。

    分析:首先不能创建新的结构,只能在树的前提下进行改变指针的指向。又由于是二叉搜索树,可以通过画图分析可知,二叉搜索树的左子树小于根节点小于右子树,可以发现是个递归过程也是一个中序遍历。所以只需要在中序那块进行指针调整。

    /*
    剑指offer面试题27
    */
    #include <iostream>
    
    using namespace std;
    
    struct BinaryTree{
        int data;
        BinaryTree* lchild;
        BinaryTree* rchild;
    };
    
    void Convert(BinaryTree* root,BinaryTree** pList){
    
        if(root == NULL){
            return;
        }
    
        BinaryTree* pTree = root;
    
        if(pTree->lchild){
            Convert(pTree->lchild,pList);
        }
    
        // 双链表
        pTree->lchild = *pList;
        if(*pList != NULL){
            (*pList)->rchild = pTree;
        }
        *pList = pTree;
    
        if(pTree->rchild){
            Convert(pTree->rchild,pList);
        }
    
    }
    
    BinaryTree* Convert(BinaryTree* root){
        BinaryTree* pList = NULL;
        Convert(root,&pList);
    
        BinaryTree* pListHead = pList;
    
        while(pListHead->lchild != NULL){
            pListHead = pListHead->lchild;
        }
        return pListHead;
    }
    
    BinaryTree* Create(){
        BinaryTree* root = new BinaryTree;
        root->data = 10;
        BinaryTree* lchild = new BinaryTree;
        lchild->data = 6;
        BinaryTree* rchild = new BinaryTree;
        rchild->data = 14;
        root->lchild = lchild;
        root->rchild = rchild;
    
        BinaryTree* lchild1 = new BinaryTree;
        lchild1->data = 4;
        BinaryTree* rchild1 = new BinaryTree;
        rchild1->data = 8;
        lchild->lchild = lchild1;
        lchild->rchild = rchild1;
    
        BinaryTree* lchild2 = new BinaryTree;
        lchild2->data = 12;
        BinaryTree* rchild2 = new BinaryTree;
        rchild2->data = 16;
        rchild->lchild = lchild2;
        rchild->rchild = rchild2;
    
        lchild1->lchild = NULL;
        lchild1->rchild = NULL;
        rchild1->lchild = NULL;
        rchild1->rchild = NULL;
    
        lchild2->lchild = NULL;
        lchild2->rchild = NULL;
        rchild2->lchild = NULL;
        rchild2->rchild = NULL;
    
        return root;
    }
    
    int main(){
        BinaryTree* root = Create();
        BinaryTree* pList = Convert(root);
    
        while(pList->rchild != NULL){
            cout << pList->data << " ";
            pList = pList->rchild;
        }
        cout << endl;
        while(pList->lchild != NULL){
            cout << pList->data << " ";
            pList = pList->lchild;
        }
    
        return 0;
    }
  • 相关阅读:
    控件
    ASP.NET简介与Repeater重复器
    WinForm简介
    ADO.net测试题
    6.08练习
    高级查询几种方法
    数据库查询的几种方式
    MySQL更新(修改、查询)
    create(创建) table(表格) student<表名>
    候选键,主键,外键
  • 原文地址:https://www.cnblogs.com/wn19910213/p/3747719.html
Copyright © 2020-2023  润新知