将二叉树转换成双向链表

思路:采用中序遍历的方法,visit函数需要完成的功能为:

1、当前节点的左子节点指向上一次访问的节点;

2、将上一次访问节点的右子节点指向当前节点;

3、最后更新上一次访问节点为当前节点。

在第二步时需要判断上一次访问节点是不是为NULL,如果是,则第二步改为链表的头结点指向当前节点。

程序如下:

struct BSTnode
{
	int data;
	BSTnode * left;
	BSTnode * right;
}*pList,*pHead;

void visit(BSTnode * pCurrent)
{
	pCurrent->left = pList;//*当前节点的左子节点指向上一次访问的节点;*//
	if (pList != NULL)
		pList->right = pCurrent;//将上一次访问节点的右子节点指向当前节点//
	else
		pHead = pCurrent;
	pList = pCurrent;
}

void inorder(BSTnode* root)
{

	if (root != NULL)
	{
		inorder(root->left);
		visit(root);
		inorder(root->right);
	}
}
时间: 2024-10-22 04:31:04

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

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

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

二叉树转换成双向链表

*.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

左神算法书籍《程序员代码面试指南》——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

新手学习算法----二叉树(将一个二叉查找树按照中序遍历转换成双向链表)

题目:将一个二叉查找树按照中序遍历转换成双向链表. 给定一个二叉查找树: 4 / 2 5 / 1 3 返回 1<->2<->3<->4<->5. 思路:如果对于当前节点,把右子树转换成双向链表,然后把左子树转换成双向链表,转换的时候我们都标记了链表的头节点和尾节点,那么只需要将当前节点和左子树的尾部相连,和右子树的头部相连即可. Java代码:这个是借鉴九章里面的解题法.但是对于左右子树转换成二叉树也不是很理解,还待需要继续分析. /** * Definit

二叉树转换成森林&amp;森林变成二叉树

一,树转换成二叉树 1,将所有兄弟结点连起来; 2,保留第一个兄弟结点与父节点的连接,断开其他兄弟结点与父节点的连接,然后以根节点为轴按照顺时针方向旋转45度 二,二叉树转换成森林 方法: 1,将每棵树转换为二叉树 2,将1中得到的二叉树的根节点看作是兄弟连接起来. 三,森林转换二叉树 右结点全部断开拿到根节点上去

二叉树转换成森林&amp;amp;森林变成二叉树

一,树转换成二叉树 1,将全部兄弟结点连起来; 2,保留第一个兄弟结点与父节点的连接,断开其它兄弟结点与父节点的连接,然后以根节点为轴依照顺时针方向旋转45度 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvU2h1aVRpYW5OYWlMdW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" > 二,二叉树转换成森林 方法: 1,将每棵树转换为二叉

二叉搜索树转换成双向链表

好一点点就是好一点点嘛 RT 传入3个参数 <根节点,上次访问的节点,头结点>.Yahoo二面被问到!完跪.... 1 void BST2DoubleList(TreeNode *root, TreeNode *& prev, TreeNode *& head) { 2 if (root == NULL) 3 return; 4 BST2DoubleList(root->left, prev, head); 5 root->left = prev; 6 if (pr

普通二叉树转换成搜索二叉树

struct ListNode { int data; ListNode *lchild,*rchild; }; void CreateBSTree(ListNode *B2_root,ListNode *BSTree_root) { if(BSTree_root==NULL) { BSTree_root = (ListNode*)malloc(sizeof(ListNode)); BSTree_root->lchild=BSTree_root->rchild=NULL; BSTree_roo