《剑指offer》– 从上往下打印二叉树、二叉搜素树的后序遍历、二叉树中和为某一值的路径、二叉树与双向链表

《剑指offer》– 从上往下打印二叉树、二叉搜素树的后序遍历、二叉树中和为某一值的路径、二叉树与双向链表

一、从上往下打印二叉树:

1、题目:

上往下打印出二叉树的每个节点,同层节点从左至右打印。

2、解题思路:

用arraylist模拟一个队列来存储相应的TreeNode。

3、代码实现:

public class Test9 {

	 public ArrayList<Integer> PrintFromTopToBottom(TreeNode root) {
		 
		 ArrayList<Integer> list=new ArrayList<Integer>();
		 if(root == null){
			 return list;
		 }
		 
		 ArrayList<TreeNode> queen=new ArrayList<TreeNode>();
		 queen.add(root);
		 while(queen.size()!=0){
			 TreeNode temp=queen.remove(0);
			 
			 if(temp.left!=null){
				 queen.add(temp.left);
			 }
			 if(temp.right!=null){
				 queen.add(temp.right);
			 }
			 
			 list.add(temp.val);
		 }
		 return list;
	 }
}

class TreeNode{
	int val = 0;
    TreeNode left = null;
    TreeNode right = null;

	public TreeNode(int val) {
        this.val = val;
    }
}

二、二叉搜索树的后序遍历:

1、题目:

输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同

2、解题思路:

已知条件:后序序列最后一个值为root;二叉搜索树左子树值都比root小,右子树值都比root大。
(1)确定root;
(2)遍历序列(除去root结点),找到第一个大于root的位置,则该位置左边为左子树,右边为右子树;
(3)遍历右子树,若发现有小于root的值,则直接返回false;
(4)分别判断左子树和右子树是否仍是二叉搜索树(即递归步骤1、2、3)。

3、代码实现:

public class Test10 {

	public boolean VerifySquenceOfBST(int [] sequence) {
        if(sequence.length==0){
        	return false;
        }
        if(sequence.length==1){
        	return true;
        }
		
		return judge(sequence,0,sequence.length-1);
    }
	
	public boolean judge(int [] sequence,int startIndex,int rootIndex){
		
		if(startIndex>rootIndex){
			return true;
		}
		int i=startIndex;
		//找到右子树的第一个节点的下标
		while(sequence[i]<sequence[rootIndex]){
			i++;
		}
		
		for(int j=i;j<rootIndex;j++){
			if(sequence[j]<sequence[rootIndex]){
				return false;
			}
		}
		return judge(sequence,startIndex,i-1)&&judge(sequence,i,rootIndex-1);
	}
}

三、二叉树中和为某一值的路径:

1、题目

输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)。

2、解题思路:

 (1)root入栈,跳入该子树进行寻路操作 ;
 (2)若root的这条路径,已满足要求,则将该路径加入到listAll中去;
 (3)对root左右子树,继续寻路;
 (4)root出栈,该子树访问完毕;

3、代码实现:

public class Test11 {

	private ArrayList<ArrayList<Integer>> resultList=new ArrayList<>();//最终返回的resultList
	private ArrayList<Integer> list= new ArrayList<>();
	
	 public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) {

		 find(root,target);
		 
		 //对resultList的进行按长度排序
		 Collections.sort(resultList,new Comparator<ArrayList<Integer>>() {
			@Override
			public int compare(ArrayList<Integer> o1, ArrayList<Integer> o2) {
				return o2.size()-o1.size();
			}
		 });
		 
		 return resultList;
	 }
	 
	 public void find(TreeNode root,int target){
		 if(root==null){
			 return ;
		 }
		 list.add(root.val);
		 target=target-root.val;
		 
		 if(target==0 && root.left==null && root.right==null){
			 resultList.add(new ArrayList<Integer>(list));
		 }
		 
		 //如果提前超过target的值,则终止遍历,不继续查找子节点
		 if(target<0){
			 list.remove(list.size()-1);
			 return ;
		 }
		 
		 find(root.left,target);
		 find(root.right,target);
		 
		 //回退
		 list.remove(list.size()-1);
	 }
}

class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

    }
}

四、二叉树与双向链表:

1、题目:

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

2、解题思路:

代码中有注释。

3、代码实现:

public class Test13 {
	
	//第二种递归方式:
	//改进步骤2:
	//记录子树链表的最后一个节点,终结点只可能为只含左子树的非叶节点与叶节点
	protected TreeNode leftLast = null;
	public TreeNode Convert2(TreeNode pRootOfTree) {
		if(pRootOfTree == null){
    		return null;
    	}
    	if(pRootOfTree.left == null && pRootOfTree.right == null){
    		leftLast = pRootOfTree;
    		return pRootOfTree;
    	}
    	
    	//1、将左子树构造成双链表,并返回链表头结点。
    	TreeNode left=Convert2(pRootOfTree.left);
    	
    	//3、如果左子树的链表不为空的话,将当前root追加到左子树链表
    	if(left!=null){
    		leftLast.right = pRootOfTree;
    		pRootOfTree.left=leftLast;
    	}
    	
    	leftLast = pRootOfTree;//当根节点只含左子树时,则该根节点为最后一个节点。
    	
    	//4、将右子树构造成双链表,并返回链表头结点
    	TreeNode right= Convert2(pRootOfTree.right);
    	
    	//5、如果右子树链表不为空的话,将该链表追加到root节点
    	if(right!=null){
    		right.left=pRootOfTree;
    		pRootOfTree.right=right;
    	}
    	return left!=null?left:pRootOfTree;
	}
	
	
	//第一种递归方式:
	public TreeNode Convert(TreeNode pRootOfTree) {
    	if(pRootOfTree == null){
    		return null;
    	}
    	if(pRootOfTree.left == null && pRootOfTree.right == null){
    		return pRootOfTree;
    	}
    	
    	//1、将左子树构造成双链表,并返回链表头结点。
    	TreeNode left=Convert(pRootOfTree.left);
    	TreeNode p=left;
    	
    	//2、定位至左子树双链表最后一个节点
    	while(p!=null && p.right!=null){
    		p=p.right;
    	}
    	
    	//3、如果左子树的链表不为空的话,将当前root追加到左子树链表
    	if(left!=null){
    		p.right = pRootOfTree;
    		pRootOfTree.left=p;
    	}
    	
    	//4、将右子树构造成双链表,并返回链表头结点
    	TreeNode right= Convert(pRootOfTree.right);
    	
    	//5、如果右子树链表不为空的话,将该链表追加到root节点
    	if(right!=null){
    		right.left=pRootOfTree;
    		pRootOfTree.right=right;
    	}
    	
    	return left!=null?left:pRootOfTree;
    }
}

class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/114695.html原文链接:https://javaforall.net

(0)
上一篇 2021年10月3日 下午7:00
下一篇 2021年10月3日 下午7:00


相关推荐

  • Linux 测试IP和端口是否能访问[通俗易懂]

    Linux 测试IP和端口是否能访问[通俗易懂]一、使用wget判断wget是linux下的下载工具,需要先安装.用法:wgetip:port连接存在的端口连接不存在的端口二、使用telnet判断telnet是windows标准服务,可以直接用;如果是linux机器,需要安装telnet.用法:telnetipport安装telnet1、检测telnet-server的rpm包是否安装……

    2025年12月13日
    5
  • CI框架部署

    CI框架部署1 源码获取在官网上下载对应版本的源码 当前最新版本是 3 1 10 版 下载解压后可以看到下面的文件列表 application 就是我们要开发的应用程序的目录 system 是 CI 框架的系统文件 整个框架的核心源码 user guide 是用户手册 可以移除到外面 用于离线阅 index php 是系统的唯一入口文件 composer json 是依赖管理文件 可以安装组件 官

    2026年3月19日
    2
  • BCG界面库_bcg模式什么意思

    BCG界面库_bcg模式什么意思本文以MDI应用程序为例说明如何在已有的VC++工程中使用BCG界面库,我的开发环境为VS2003。1,将BCG/BCGCBPro目录路径添加到“项目属性->C/C++->常规->附加包含目录”中,同时将BCG/Bin目录路径添加到“项目属性->链接器->常规->附加库目录”中。2,确保在CWinApp派生类(设为CMyApp)的InitInstance()成员函数中调用A

    2022年10月8日
    4
  • python程序设计实践题EXP01-求圆面积、温度转换和绘制五角星

    python程序设计实践题EXP01-求圆面积、温度转换和绘制五角星一、计算圆的面积思路:根据圆面积的计算公式进行求解。程序代码:1importmath2radius=253area=math.pi*radius**2#**是幂运算4p

    2022年7月5日
    26
  • jvm垃圾回收详解_java 垃圾回收器

    jvm垃圾回收详解_java 垃圾回收器JVM垃圾回收1.概述JVM会自动帮程序员进行垃圾回收,并不需要程序员手动的进行垃圾回收(C++等语言需要自己手动回收垃圾),了解JVM的垃圾回收,可以帮程序员写出占用内存更小、更高效的程序。1.1什么是垃圾?垃圾是指运行程序中没有任何指针指向的对象,这个对象就是需要被回收的垃圾。1.2什么区域需要进行垃圾回收JVM的内存结构包括五大区域:程序计数器、虚拟机栈、本地方法栈、堆区、方法区。其中程序计数器、虚拟机栈、本地方法栈3个区域随线程而生、随线程而灭,因此这几个区域的内存分配和回

    2025年10月31日
    5
  • Maven 配置环境变量后无法立刻生效「建议收藏」

    Maven 配置环境变量后无法立刻生效「建议收藏」    最近在系统学习Maven,在解压完Maven,并配置环境变量后,在黑窗口用mvn-n查询不到。   仔细研究后发现,我在配置环境变量之前就打开了黑窗口,导致无法查到最新的,所以只要重新打开黑窗口就能查到了。…

    2022年7月24日
    11

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号