剑指offer--二叉搜索树与双向链表

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

/*
 * 采用中序遍历
修改中序遍历,在其中加入一个前驱结点
遍历左子树
当前结点指向左指针指向前驱结点
前驱结点右指针指向当前结点
前驱 = 当前
遍历右子树
 */
public class Main31 {

	//双向链表的左边头结点和右边头结点
	TreeNode head = null;
	TreeNode realHead = null;
	public TreeNode Convert(TreeNode pRootOfTree) {
		ConvertSub(pRootOfTree);
		return realHead;
    }

	private void ConvertSub(TreeNode pRootOfTree) {
		//递归调用叶子节点的左右节点返回null
		if(pRootOfTree==null)
			return ;
		//第一次运行时,它会使最左边叶子节点为链表第一个节点
		ConvertSub(pRootOfTree.left);
		if(head == null) {
			head = pRootOfTree;
			realHead = pRootOfTree;
		}else {
			//把根节点插入到双向链表的头结点,head向后移动
			head.right = pRootOfTree;
			pRootOfTree.left = head;
			head = pRootOfTree;
		}
		//把右叶子节点也插入到双向链表
		ConvertSub(pRootOfTree.right);
	}
}

  

posted @ 2018-05-18 11:27  dreamy_java  阅读(106)  评论(0编辑  收藏  举报