二叉树与双向链表的转换

题目描述

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

分析:二叉搜索树要转成有序的链表,可以想到的是利用中序遍历二叉树,每得到一个输出结点就修改其指针指向,从而构成有序链表。

题解:

/*
struct TreeNode {
	int val;
	struct TreeNode *left;
	struct TreeNode *right;
	TreeNode(int x) :
			val(x), left(NULL), right(NULL) {
	}
};*/

class Solution {
public:
    TreeNode* Convert(TreeNode* pRootOfTree)
    {
        if(pRootOfTree == nullptr)    return nullptr;
        // 非递归算法,故用堆栈
        stack<TreeNode*> sck;
        TreeNode *pCur = pRootOfTree;
        TreeNode *pNode = nullptr;        // 存储前一个输出结点
        TreeNode *pHead = nullptr;        // 存储有序链表表头
        while(!sck.empty() || pCur != nullptr) {

            while(pCur != nullptr) {
                sck.push(pCur);
                pCur = pCur->left;
            }
            pCur = sck.top();
            // 处理输出结点
            if(pNode != nullptr) {
                pNode->right = sck.top();
                sck.top()->left = pNode;
                pNode = sck.top();
            }
            if(pNode == nullptr) {
                pNode = sck.top();
                pHead = pNode;
            }
            pNode = sck.top();
            sck.pop();

            if(pCur->right) {
                pCur = pCur->right;
            }
            else {
                pCur = nullptr;
            }
        }
        return pHead;
    }
};

  

原文地址:https://www.cnblogs.com/xzxl/p/9611161.html

时间: 2024-11-05 16:37:49

二叉树与双向链表的转换的相关文章

二叉搜索树与双向链表的转换

题目:输入一棵二叉搜索树(记住是搜索树),将该二叉搜索树转换为一个排序的双向链表.要求:不能创建任何新的结点,只能调整树中结点指针的指向. 分析:如下图 因为是二叉搜索树.所以树的排列是规则的.通过中序遍历正好遍历的是由小到大的序列. 要求说明是只能改变树结点指针的指向,不能增加新的空间和结点.所以在中序遍历的时候,主要是遍历到结点后就去改变指针指向. 为了简单,采用递归进行遍历. 树的结构 struct BinaryTreeNode{ int m_data; BinaryTreeNode* m

HLG 2040 二叉树的遍历 (二叉树遍历之间的转换)

链接:http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=2040 Description: 给出一棵二叉树的中序和前序遍历,输出它的后序遍历. Input 本题有多组数据,输入处理到文件结束. 每组数据的第一行包括一个整数n,表示这棵二叉树一共有n个节点. 接下来的一行每行包括n个整数,表示这棵树的中序遍历. 接下来的一行每行包括n个整数,表示这棵树的前序遍历. 3<= n <= 1

基于二叉树和双向链表实现限制长度的最优Huffman编码

该代码采用二叉树结合双向链表实现了限制长度的最优Huffman编码,本文代码中的权重全部采用整数值表示.http://pan.baidu.com/s/1mgHn8lq 算法原理详见:A fast algorithm for optimal length-limited Huffman codes.pdf 示例:符号ABCDE的权重分别为10,6,2,1,1 不限制长度的最优Huffman编码为A:0,B:10,C:110,D:1110,E:1111,平均码长为1.8bits/symbol; 限制

算法题——二叉树转换为双向链表

1 BSTreeNode* ConvertNode(BSTreeNode* pNode, bool asRight) 2 { 3 if(!pNode) 4 return NULL; 5 6 BSTreeNode *pLeft = NULL; 7 BSTreeNode *pRight = NULL; 8 9 // Convert the left sub-tree 10 if(pNode->m_pLeft) 11 pLeft = ConvertNode(pNode->m_pLeft, false

二叉树转双向链表

二叉排序树在不改变BinaryNode<Type>的 struct{data;*left;*right}  情况下是可以转换成双向链表的. 由于二叉树的主要数据都记录在根节点BinaryNode<Type>* root 上的,所以这里就只用BinaryNode类手动建一棵树, 树形如下: 新增的有三个主要函数, BinaryNode<Type>* GetHead() 是用来查找右子树最小的那个节点 BinaryNode<Type>* GetTail() 是用

树、二叉树、森林的转换

树转换为二叉树 (1)加线.在所有兄弟结点之间加一条连线. (2)去线.树中的每个结点,只保留它与第一个孩子结点的连线,删除它与其它孩子结点之间的连线. (3)层次调整.以树的根节点为轴心,将整棵树顺时针旋转一定角度,使之结构层次分明.(注意第一个孩子是结点的左孩子,兄弟转换过来的孩子是结点的右孩子) 森林转换为二叉树 (1)把每棵树转换为二叉树. (2)第一棵二叉树不动,从第二棵二叉树开始,依次把后一棵二叉树的根结点作为前一棵二叉树的根结点的右孩子,用线连接起来. 二叉树转换为树 是树转换为二

将一棵二叉树转换为双向链表的俩中算法

要求:输入一棵二叉排序树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建新的结点,只能调整树中结点的指针的指向.如下图: 方法一:我们借助一个容器来顺序存储结点的指针,然后改变指针的指向. 1 //////////////////////二叉搜索树与双向链表(方法一)////////////////////////////////////////// 2 3 void Convertfirst(BinaryTreeNode* pRoot , vector<BinaryTreeNode*>

算法题:用二叉树构造双向链表

#include <iostream> #include <string.h> using namespace std; struct Node { Node *left;//相当于双向链表的prev指针. Node *right;//相当于双向链表的next指针. char data; Node(char d = char()):data(d),left(NULL),right(NULL){} }; class MTree { public: MTree():root(NULL)

二叉树与双向链表问题

做完这道题,我深刻认识到通过边画图边写代码揣摩分析才能真正弄懂这道题,而且如果不是独立思考AC看了题解恐怕就很难弄懂这道题. 这里整理一下题解:本题思路有两种:递归和非递归 Java版AC代码: 数据结构定义: 1 /** 2 public class TreeNode { 3 int val = 0; 4 TreeNode left = null; 5 TreeNode right = null; 6 7 public TreeNode(int val) { 8 this.val = val;