将二叉树转化为双向链表

递归解法:

(1)如果二叉树查找树为空,不需要转换,对应双向链表的第一个节点是NULL,最后一个节点是NULL

(2)如果二叉查找树不为空:

如果左子树为空,对应双向有序链表的第一个节点是根节点,左边不需要其他操作;

如果左子树不为空,转换左子树,二叉查找树对应双向有序链表的第一个节点就是左子树转换后双向有序链表的第一个节点,同时将根节点和左子树转换后的双向有序链 表的最后一个节点连接;

如果右子树为空,对应双向有序链表的最后一个节点是根节点,右边不需要其他操作;

如果右子树不为空,对应双向有序链表的最后一个节点就是右子树转换后双向有序链表的最后一个节点,同时将根节点和右子树转换后的双向有序链表的第一个节点连 接。

参考代码如下:

    /******************************************************************************
    参数:
    pRoot: 二叉查找树根节点指针
    pFirstNode: 转换后双向有序链表的第一个节点指针
    pLastNode: 转换后双向有序链表的最后一个节点指针
    ******************************************************************************/
    void Convert(BinaryTreeNode * pRoot,
                 BinaryTreeNode * & pFirstNode, BinaryTreeNode * & pLastNode)
    {
        BinaryTreeNode *pFirstLeft, *pLastLeft, * pFirstRight, *pLastRight;
        if(pRoot == NULL)
        {
            pFirstNode = NULL;
            pLastNode = NULL;
            return;
        }  

        if(pRoot->m_pLeft == NULL)
        {
            // 如果左子树为空,对应双向有序链表的第一个节点是根节点
            pFirstNode = pRoot;
        }
        else
        {
            Convert(pRoot->m_pLeft, pFirstLeft, pLastLeft);
            // 二叉查找树对应双向有序链表的第一个节点就是左子树转换后双向有序链表的第一个节点
            pFirstNode = pFirstLeft;
            // 将根节点和左子树转换后的双向有序链表的最后一个节点连接
            pRoot->m_pLeft = pLastLeft;
            pLastLeft->m_pRight = pRoot;
        }  

        if(pRoot->m_pRight == NULL)
        {
            // 对应双向有序链表的最后一个节点是根节点
            pLastNode = pRoot;
        }
        else
        {
            Convert(pRoot->m_pRight, pFirstRight, pLastRight);
            // 对应双向有序链表的最后一个节点就是右子树转换后双向有序链表的最后一个节点
            pLastNode = pLastRight;
            // 将根节点和右子树转换后的双向有序链表的第一个节点连接
            pRoot->m_pRight = pFirstRight;
            pFirstRight->m_pRight = pRoot;
        }  

        return;
    }
时间: 2024-10-09 01:16:25

将二叉树转化为双向链表的相关文章

C++二叉查找树实现及转化为双向链表

二叉树首先要有树节点 template<class T> class BinaryNode { public: T element; BinaryNode *left; BinaryNode *right; public: BinaryNode(T passelement); ~BinaryNode(); }; template<class T> BinaryNode<T>::BinaryNode(T passelement) { this->element=pa

二叉排序树转化成双向链表

题目描述: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 输入: 输入可能包含多个测试样例. 对于每个测试案例,输入的第一行为一个数n(0<n<1000),代表测试样例的个数. 接下来的n行,每行为一个二叉搜索树的先序遍历序列,其中左右子树若为空则用0代替. 输出: 对应每个测试案例, 输出将二叉搜索树转换成排序的双向链表后,从链表头至链表尾的遍历结果. 样例输入: 1 2 1 0 0 3 0 0 样例输出: 1 2 3 思

平衡二叉树转化为双向链表

很容易想到递归,实现确实不是太容易,对本人来说. 平衡二叉树是有序的,要求链表也是有序. \ 代码: #include<iostream> //平衡二叉树转化为双向链表 using namespace std; typedef struct tree{ int data; struct tree *lchild; struct tree *rchild; }Tree,*pTree; void createBST(pTree &pHead){ int temp; scanf("

栈和队列----将搜索二叉树转换成双向链表

将搜索二叉树转换成双向链表 对于BST 来说,有本身的值域,有指向左孩子和右孩子的两个指针:对于双向链表来说,有本身的值域,有指向上一个节点和下一个节点的指针.将这个BST转换成双向链表,对于每一个节点来说,原来的right指针等价于转换后的next指针,原来的left指针等价于转换后的left指针,最后返回双向链表的头节点. [解析] 用队列等容器收集二叉树 中序遍历的结果的方法.其时间复杂度是O(N),空间复杂度是O(N). 1. 生成一个队列,记为queue,按照二叉树的中序遍历的顺序,将

二叉搜索树转化为双向链表

1. 题目 输入一棵二叉搜索树,现在要将该二叉搜索树转换成一个排序的双向链表.而且在转换的过程中,不能创建任何新的结点,只能调整树中的结点指针的指向来实现. 二叉树结点的定义如下: struct BinaryTreeNode { intm_nValue; BinaryTreeNode*m_pLeft; BinaryTreeNode*m_pRight; }; 如图1-1(a)为一棵二叉搜索树,1-1(b)为对应的双向链表. 图1-1转化示意图 2. 分析 (1) 二叉搜索树中序遍历可得有序的结点序

二叉树转换成双向链表

*.hl_mark_KMSmartTagPinkImg{background-color:#ffaaff;}*.hl_mark_KMSmartTagBlueImg{background-color:#99ccff;}*.hl_mark_KMSmartTagYellowImg{background-color:#ffff66;}*.hl_mark_KMSmartTagOrangeImg{background-color:#ffad5b;}*.hl_mark_KMSmartTagGreenImg{b

双向链表(4) - 排序二叉树转换为循环双向链表

构建一个递归函数treeToList(Node root),将一棵已排序的二叉树,调整内部指针,使之从外面看起来,是一个循环双向链表.其中前向指针存储在"small"区域,后向指针存储在"large"区域.链表需要进行调整进行升序排序,并返回链表头指针. 下面的这篇文章详细解释了这个转换的过程. http://cslibrary.stanford.edu/109/TreeListRecursion.html 以下是对这篇文章的翻译: The Great Tree-L

左神算法书籍《程序员代码面试指南》——2_12将搜索二叉树转换成双向链表

对二叉树的节点来说,有本身的值域,有指向左孩子和右孩子的两个指针:对双向链表的节点来说,有本身的值域,有指向上一个节点和下一个节点的指针.在结构上,两种结构有相似性,现在有一棵搜索二叉树,请将其转换为一个有序的双向链表. 1 #include <iostream> 2 #include <queue> 3 using namespace std; 4 struct treeNode 5 { 6 int v; 7 treeNode *l, *r; 8 treeNode(int a =

Cracking-- 17.13 将二叉树转换成双向链表

在书的105页 使用中根遍历的思想 left 之后 为 root 之后 为 right 则对左子树来说 left->right = root; root->left = left; 对右子树来说 root->right = right-> -> -> left; left->left 为根的根   的根 而right->left 则为直接的根 #include <iostream> #include <vector> using na