剑指offer(20)二叉搜索树与双向表
题目:
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
思路一:递归法
1.将左子树构造成双链表,并返回链表头节点。 2.定位至左子树双链表最后一个节点。 3.如果左子树链表不为空的话,将当前root追加到左子树链表。 4.将右子树构造成双链表,并返回链表头节点。 5.如果右子树链表不为空的话,将该链表追加到root节点之后。 6.根据左子树链表是否为空确定返回的节点。class Untitled {
	public static void main(String[] args) {
		TreeNode node1 = new TreeNode(10);
		TreeNode node2 = new TreeNode(6);
		TreeNode node3 = new TreeNode(14);
		TreeNode node4 = new TreeNode(4);
		TreeNode node5 = new TreeNode(8);
		TreeNode node6 = new TreeNode(12);
		TreeNode node7 = new TreeNode(16);
		node1.setNode(node2,node3);
		node2.setNode(node4,node5);
		node3.setNode(node6,node7);
		Solution s = new Solution();
		TreeNode p = s.Convert(node1);
		while(p.right!=null){
			System.out.println(p.val);
			p = p.right;
		}
	}
}
	//树的定义
class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;
    public TreeNode(int val) {
        this.val = val;
    }
	public void setNode(TreeNode node1,TreeNode node2){
		this.left = node1;
		this.right = node2;
	}
}
//解方法
class Solution {
    public TreeNode Convert(TreeNode root) {
        if(root==null)
            return null;
        if(root.left==null&&root.right==null)
            return root;
// 1.将左子树构造成双链表,并返回链表头节点
        TreeNode left = Convert(root.left);
        TreeNode p = left;
 // 2.定位至左子树双链表最后一个节点
        while(p!=null&&p.right!=null){
            p = p.right;
        }
// 3.如果左子树链表不为空的话,将当前root追加到左子树链表
        if(left!=null){
            p.right = root;
            root.left = p;
        }
// 4.将右子树构造成双链表,并返回链表头节点
        TreeNode right = Convert(root.right);
 // 5.如果右子树链表不为空的话,将该链表追加到root节点之后
        if(right!=null){
            right.left = root;
            root.right = right;
        }
        return left!=null?left:root;
    } 
}
思路二:
如果知道二叉搜索树的中序遍历是有序列的话,那么这道题的方法也就呼之欲出了
public class Solution {
    TreeNode realHead = null;
    TreeNode head = null;
    public TreeNode Convert(TreeNode root) {
        ConvertHelp(root);
        return realHead;
    }
    public void ConvertHelp(TreeNode root){
        if(root==null)
            return;
        ConvertHelp(root.left);
        if(realHead==null){
            head = root;
            realHead = root;
        }else{
            head.right = root;
            root.left = head;
            head = root;
        }
        ConvertHelp(root.right);
    }
}
由于中序遍历的特点,第一次碰到的绝对是最左下的结点,因此可以将头节点赋给他。
剑指offer(20)二叉搜索树与双向表的更多相关文章
- 【剑指Offer】二叉搜索树与双向链表 解题报告(Python)
		[剑指Offer]二叉搜索树与双向链表 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interview ... 
- 【剑指Offer】二叉搜索树的后序遍历序列 解题报告(Python)
		[剑指Offer]二叉搜索树的后序遍历序列 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-intervi ... 
- 《剑指offer》二叉搜索树的后序遍历序列
		本题来自<剑指offer> 二叉搜索树的后序遍历序列 题目: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字 ... 
- 剑指Offer:二叉搜索树的后序遍历序列【33】
		剑指Offer:二叉搜索树的后序遍历序列[33] 题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. ... 
- 剑指 Offer 36. 二叉搜索树与双向链表 + 中序遍历 + 二叉排序树
		剑指 Offer 36. 二叉搜索树与双向链表 Offer_36 题目描述 题解分析 本题考查的是二叉树的中序遍历以及二叉排序树的特征(二叉排序树的中序遍历序列是升序序列) 利用排序二叉树中序遍历的性 ... 
- 剑指 Offer 33. 二叉搜索树的后序遍历序列 + 根据二叉树的后序遍历序列判断对应的二叉树是否存在
		剑指 Offer 33. 二叉搜索树的后序遍历序列 Offer_33 题目详情 题解分析 本题需要注意的是,这是基于一颗二叉排序树的题目,根据排序二叉树的定义,中序遍历序列就是数据从小到大的排序序列. ... 
- 剑指 Offer 36. 二叉搜索树与双向链表
		剑指 Offer 36. 二叉搜索树与双向链表 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表.要求不能创建任何新的节点,只能调整树中节点指针的指向. 为了让您更好地理解问题,以下面的 ... 
- 剑指 Offer 33. 二叉搜索树的后序遍历序列
		剑指 Offer 33. 二叉搜索树的后序遍历序列 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果.如果是则返回 true,否则返回 false.假设输入的数组的任意两个数字都互不相同. ... 
- 力扣 - 剑指 Offer 54. 二叉搜索树的第k大节点
		题目 剑指 Offer 54. 二叉搜索树的第k大节点 思路1 二叉搜索树的特性就是中序遍历结果为递增序列,而题目要求的是第 k 大节点,所以就应该是要遍历结果为降序, 按照先遍历左子树.输出节点.遍 ... 
- 【剑指Offer】二叉搜索树的第k个结点 解题报告(Python)
		[剑指Offer]二叉搜索树的第k个结点 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-intervie ... 
随机推荐
- linux 基本操作
			终端常用快捷键 ctrl+c 中断运行ctrl+d 退出中断ctrl+s 暂停当前程序,暂停后按下任意键恢复运行 ctrl+k 删除从光标所在位置到行末 Alt+Backspace 向前删除一个单词 ... 
- Oracle 周相关函数
			Oracle 周相关函数 select trunc(sysdate,'W'), --每月1日作为第一个星期第一天 取当前周第一天对应日期 trunc(sysdate,'WW'), --每年1月1日 ... 
- 剑指offer——矩形覆盖
			我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形.请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 分析:斐波那契数列的变形 n=0,返回0 n=1,返回1 n=2,返回 ... 
- c# 设置IE浏览器版本运行程序-设置webBrowser对应的IE内核版本来运行
			//通常情况下,我们直接调用C#的webBrowser控件,默认的浏览器内核是IE7. 那么如何修改控件调用的默认浏览器版本呢?using System; using System.Collecti ... 
- Tomcat优化之容易集合经验
			Tomcat优化1. 如何加大tomcat连接数在tomcat配置文件server.xml中的<Connector ... />配置中,和连接数相关的参数有: maxThreads : t ... 
- 在Winform框架界面中改变并存储界面皮肤样式
			在本篇介绍的Winform界面样式改变及存储操作中,是指基于DevExpress进行界面样式的变化.一般情况下,默认我们会为客户提供多种DevExpress的界面皮肤以供个人喜好选择,默认DevExp ... 
- 多模块后带来的问题解决方法 - OSGI原形(.NET)
			目前只做了基础的功能,比如: 各个模块单独的AppDomain容器 Activator激活 导出的服务检查 不过,虽说这样,但目前的这个版本已经能实现模块分离.互相依赖调用等功能了,对模块划分已经有很 ... 
- 朱晔的互联网架构实践心得S1E9:架构评审一百问和设计文档五要素
			朱晔的互联网架构实践心得S1E9:架构评审一百问和设计文档五要素 [下载文本PDF进行阅读] 本文我会来说说我认为架构评审中应该看的一些点,以及我写设计文档的一些心得.助你在架构评审中过五关斩六将,助 ... 
- Mac 小记 — iTerm2、Zsh、Homebrew
			前言 写完 "Ubuntu 自动化配置" 这篇文章后,每次连服务器心情指数都上升好几个百分点,于是想着应该将 macOs 的开发环境也梳理梳理,应该会对开发效率有所增益. 1. i ... 
- VS2017开发的IDE扩展
			Tag Helpers 智能提示 Razor Language Services: https://marketplace.visualstudio.com/items?itemName=ms-mad ... 
