GVKun编程网logo

剑指offer第二版面试题7:二叉树的下一个节点(JAVA版本)(java 二叉树 面试)

32

在本文中,我们将为您详细介绍剑指offer第二版面试题7:二叉树的下一个节点的相关知识,并且为您解答关于JAVA版本的疑问,此外,我们还会提供一些关于LeetCode剑指Offer面试题27.二叉树的

在本文中,我们将为您详细介绍剑指offer第二版面试题7:二叉树的下一个节点的相关知识,并且为您解答关于JAVA版本的疑问,此外,我们还会提供一些关于LeetCode 剑指Offer 面试题27. 二叉树的镜像、[剑指Offer]55-题目一:二叉树的深度 题目二:平衡二叉树、《剑指Offer》-004 -Java版二叉树先序和中序遍历返回原二叉树、《剑指offer》面试题18 树的子结构 Java版的有用信息。

本文目录一览:

剑指offer第二版面试题7:二叉树的下一个节点(JAVA版本)(java 二叉树 面试)

剑指offer第二版面试题7:二叉树的下一个节点(JAVA版本)(java 二叉树 面试)

题目:给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。

分析:
根据中序遍历的特点,要找到一个节点的下一个节点无非就是三种情况:
1、有右子树,这时只需要把其右孩子作为下一个遍历的(并不是要找的)节点,然后沿着该节点的左子树(如果有的话)出发,直到遇到叶子节点,那么该叶子节点就是其下一个要找的节点;
2、没有右子树,则判断该节点是否是其父节点的左孩子,如果是则其下一个要找的节点是其父节点;
3、如果不是其父节点的左孩子,则把其父节点作为下一个遍历的节点,向上回溯,直到找到节点没有父节点或者节点是其父节点的左孩子为止。
综合这三种情况就可以找到二叉树中任意一个节点的下一个节点。

代码如下:

public class FindNextNode {
    public BinaryTreeNode getNextNode(BinaryTreeNode pNode){
        if(pNode==null){
            return null;
        }
        //如果该节点有右节点
        if(pNode.getRightNode()!=null){
            BinaryTreeNode tempNode=pNode.getRightNode();
            while(tempNode.getLeftNode()!=null){
                tempNode=tempNode.getLeftNode();
            }
            return tempNode;
        }
        //如果没有右节点,是其父节点的左子节点
        if(pNode.getFatherNode()==null){
            return null;
        }
        if(pNode.getFatherNode().getLeftNode()==pNode){
            return pNode.getFatherNode();
        }
        
        //如果没有右节点,是其父节点的右子节点,一直向上找父节点直到没有父节点
        if(pNode.getFatherNode()==null){
            return null;
        }
        if(pNode.getFatherNode().getRightNode()==pNode){
            BinaryTreeNode tempNode=pNode.getFatherNode();
            while(tempNode.getFatherNode()==null){
                tempNode=tempNode.getFatherNode();
            }
            return tempNode;
        }
        return null;
    }
}

 

LeetCode 剑指Offer 面试题27. 二叉树的镜像

LeetCode 剑指Offer 面试题27. 二叉树的镜像

文章目录

  • 一、面试题27. 二叉树的镜像
  • 二、解题
    • (一)非递归方式
    • (二)递归方式
  • 三、小郑有话说

一、面试题27. 二叉树的镜像

请完成一个函数,输入一个二叉树,该函数输出它的镜像。

例如输入:

     4
   /   \
  2     7
 / \   / \
1   3 6   9

镜像输出:

     4
   /   \
  7     2
 / \   / \
9   6 3   1

示例 1:

输入:root = [4,2,7,1,3,6,9]
输出:[4,7,2,9,6,3,1]

二、解题

这个题很直白的就是反转二叉树

(一)非递归方式

package tree.二叉树的镜像;


import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;

/**
 * @Auther: truedei
 * @Date: 2020 /20-6-10
 * @Description: 二叉树镜像
 */
public class Solution {
   
   
   

    static public TreeNode mirrorTree(TreeNode root) {
   
   
   

        if(root==null)
            return null;

        LinkedList<TreeNode> queue = new LinkedList<>();

        queue.add(root);

        TreeNode gen = new TreeNode(root.val);

        while (!queue.isEmpty()){
   
   
   
			
			//交换位置
            TreeNode node = queue.pop();
            TreeNode temp = node.left;
            node.left= node.right;
            node.right = temp;

            if(node.left!=null)
                queue.add(node.left);

            if(node.right!=null)
                queue.add(node.right);


        }

        return root;
    }


    public static void main(String[] args) {
   
   
   
        TreeNode t1 = new TreeNode(4);
        TreeNode t2 = new TreeNode(2);
        TreeNode t3 = new TreeNode(7);
        TreeNode t4 = new TreeNode(1);
        TreeNode t5 = new TreeNode(3);
        TreeNode t6 = new TreeNode(6);
        TreeNode t7 = new TreeNode(9);


        t1.left=t2;
        t1.right=t3;

        t2.left=t4;
        t2.right=t5;

        t3.left=t6;
        t3.right=t7;

        TreeNode treeNode = mirrorTree(t1);
     

    }





}

class TreeNode {
   
   
   
    int val;//每个节点存放的数据
    TreeNode left;//左节点
    TreeNode right;//右节点
    TreeNode(int x) {
   
   
    val = x; }
}

(二)递归方式

 public TreeNode mirrorTree(TreeNode root) {
   
   
   

        //根节点为null时,返回null
        if(root==null)
            return null;

        //当只有根节点时,直接返回
        if(root!=null && root.left==null && root.right==null)
            return root;

        //交换位置
        TreeNode temp = root.left;
        root.left=root.right;
        root.right=temp;


        if(root.left!=null)
            mirrorTree(root.left);

        if(root.right!=null)
            mirrorTree(root.right);

        return root;
    }

三、小郑有话说

如果对你有帮助,可以分享给你身边的朋友。或者给俺点个大大的赞和大大的评论点赞评论就是给我最大的支持,感谢。
水平有限,难免会有疏漏或者书写不合理的地方,欢迎交流讨论。
作者:TrueDei
作者唯一博客CSDN:https://truedei.blog.csdn.net/
转载说明:如需转载请注明原地址和作者名。

如果喜欢我的文章,还没看够可以关注我,我会用心写好每一篇文章。

欢迎大佬们加入在下的小社,在此大家可以放开的交流,共同学习进步:
在这里插入图片描述

客官、点个赞再走吧
在这里插入图片描述

本文分享 CSDN - TrueDei。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

[剑指Offer]55-题目一:二叉树的深度 题目二:平衡二叉树

[剑指Offer]55-题目一:二叉树的深度 题目二:平衡二叉树

###题目一 ####题目 输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。 ####题解 递归。 ####代码

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

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

public class Main {
	public int TreeDepth(TreeNode root) {
        if(root==null) {
        	return 0;
        }
        return Math.max(TreeDepth(root.left),TreeDepth(root.right))+1;
    }
}

###题目二 ####题目 判断二叉树是不是平衡二叉树。注意,此处定义的平衡二叉树:递归地,左右两个子树相差<=1。而不需要二叉搜索树条件。 ####题解 后序遍历,返回值包含是否平衡和当前子树高度。每个节点只需遍历一遍。 ####代码

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

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

class ReturnType{
	boolean balanceTag;
	int deepth;
	ReturnType(boolean balanceTag,int deepth){
		this.balanceTag=balanceTag;
		this.deepth=deepth;
	}
}

public class Main {
	public static void main(String[] args) {
		//test case
		TreeNode node1=new TreeNode(1);
		TreeNode node2=new TreeNode(2);
		TreeNode node3=new TreeNode(3);
		TreeNode node4=new TreeNode(4);
		TreeNode node5=new TreeNode(5);
		node1.left=node2;
		node1.right=node3;
		node2.left=node4;
		node4.left=node5;
		
		System.out.println(isBalanced(node1).balanceTag);
	}
	
	public static ReturnType isBalanced(TreeNode root){
		if(root==null) {
			return new ReturnType(true,0);
		}
		ReturnType r1=isBalanced(root.left);
		ReturnType r2=isBalanced(root.right);
		int dif=Math.abs(r1.deepth-r2.deepth);
		int deepth=Math.max(r1.deepth, r2.deepth)+1;
		if(r1.balanceTag&&r2.balanceTag&&dif<=1) {
			return new ReturnType(true,deepth);
		}
		return new ReturnType(false,deepth);
	}
}

《剑指Offer》-004 -Java版二叉树先序和中序遍历返回原二叉树

《剑指Offer》-004 -Java版二叉树先序和中序遍历返回原二叉树

如题 (总结要点)

    1. 注意空值
    1. 假定数据是没有问题的
    1. 前序(根左右) ,中序(左根右), 故每次的第一个节点就是根节点
    1. 没用数组的库函数,自己手写了两个方法
    1. 用Java代码写二叉树很舒服, 没有啥指针,直接赋值就行了!毕竟Java除了基本数据类型传参是形参, 其余都是实参传递.
  • 原文链接 : https://www.nowcoder.com/practice/8a19cbe657394eeaac2f6ea9b0f6fcf6?tpId=13&tqId=11157&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

借鉴学习文章列表

  • 链接1:
  • 链接2:
  • ALiBaBaJavaCodingGuideLines有话说 :

1.题目

题目描述
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回

2. Solution代码

/**
 * FileName: ${FILENAME}
 * 类的详细说明 : 1. 注意空值
 *                2. 假定数据是没有问题的
 *                3.前序(根左右) ,中序(左根右), 故每次的第一个节点就是根节点
 * @author SongZeShan
 * @version 1.0
 * @Date 2019/7/11 18:10
 */
public class Solution {
    /**重建出该二叉树*/
    public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
        if(pre.length==0||in.length==0||pre.length!=in.length){
            return null;
        }
        //建树,根节点赋值
        TreeNode treeNode = new TreeNode(pre[0]);
        int index = indexOf(in,pre[0]);
        //左子树长度为index-1
        treeNode.left = reConstructBinaryTree(copyRange(pre, 1, index), copyRange(in, 0, index-1));
        //右子树为长度为in.length-index
        treeNode.right = reConstructBinaryTree(copyRange(pre, index+1, pre.length-1), copyRange(in, index+1, pre.length-1));

        return treeNode;
    }
    /**复制下标*/
    private int[] copyRange(int arr[],int beg,int end){
        int []newArr = new int[end-beg+1];
        for(int i=beg;i<=end;i++){
            newArr[i-beg]=arr[i];
        }
        return newArr;
    }
    /**查找key值,返回索引index*/
    private int indexOf(int []arr,int key){
        for(int i=0;i<arr.length;i++){
            if(key==arr[i]){
                return i;
            }
        }
        return -1;
    }
}

3.TreeNode 二叉树代码

public class TreeNode {
     int val;
     TreeNode left;
     TreeNode right;
     TreeNode(int x) { val = x; }
}

4.测试

/**
 * FileName: ${FILENAME}
 * 类的详细说明
 *
 * @author SongZeShan
 * @version 1.0
 * @Date 2019/7/11 18:10
 */
public class Test {
    public static void main(String[] args) {
        Solution solution = new Solution();
        int pre[] = {1,2,4,7,3,5,6,8};
        int in[] = {4,7,2,1,5,3,8,6};

        TreeNode treeNode = solution.reConstructBinaryTree(pre,in );

        //输出测试
        preOrder(treeNode);
        System.out.println();
        midOrder(treeNode);
    }
    /**遍历一次二叉树先序输出*/
    private static void preOrder(TreeNode node){
        if(node==null){
            return ;
        }
        System.out.print(node.val+"\t");
        preOrder(node.left);
        preOrder(node.right);
    }
    /**遍历一次二叉树中序输出*/
    private static void midOrder(TreeNode node){
        if(node==null){
            return ;
        }
        midOrder(node.left);
        System.out.print(node.val+"\t");
        midOrder(node.right);
    }
}

测试结果 ,和原答案一模一样

1	2	4	7	3	5	6	8	
4	7	2	1	5	3	8	6	
Process finished with exit code 0

《剑指offer》面试题18 树的子结构 Java版

《剑指offer》面试题18 树的子结构 Java版

(输入两棵二叉树A和B,判断B是不是A的子结构。补充下,根据书中的代码来看,子结构的定义并不包括叶子节点下的null,也就是说只要B的存在数字的结构存在于A中就行,那么如果B是null树,那么就不属于A的子结构)

书中方法:书上的方法十分清晰,分为两个步骤,先在A树中找到B树的root.val,然后判断由该点向下是否完全包含B树的结构,直至遍历完A树。

	public boolean isChild(TreeNode aRoot, TreeNode bRoot){
		//A树没有遍历完而且B树不为空
		if(aRoot != null && bRoot != null){
			//在当前节点检查结构,或者去遍历当前节点的左节点或右节点。
			return isQualified(aRoot, bRoot) 
					|| isChild(aRoot.left, bRoot) 
					|| isChild(aRoot.right, bRoot);
		}
		//A树遍历完了或者B树是个null
		return false;
	}
	
	private boolean isQualified(TreeNode aRoot, TreeNode bRoot){
		//检查到了B的末尾
		if(bRoot == null)return true;
		
		//如果在检查完B之前A到了底
		if(aRoot == null)return false;
		
		//都不是null且val相等,继续检查
		if(aRoot.val == bRoot.val){
			return isQualified(aRoot.left, bRoot.left) 
					&& isQualified(aRoot.right, bRoot.right);
		}
		
		//都不是null但是val不等
		return false;
		
	}

我的方法:开始检查一下B是否为空,空的话返回false(定义)。aRoot和bRoot是两个根节点,且都可能在自己的根节点和子节点之间转换。开头,如果aRoot.val和bRoot.val相等了,那么继续对各自的子节点进行对比;如果不相等则移动aRoot并和bRoot进行比较。

	public boolean isChildTree(TreeNode aRoot, TreeNode bRoot){
		//定义,如果B树为空,返回false
		if(bRoot == null){
			return false;
		}
		return isChild2(aRoot, bRoot);
	}
	
	private boolean isChild2(TreeNode aRoot, TreeNode bRoot){
		//如果检查到了B的末尾
		if(bRoot == null)return true;
		
		//A到了末尾但是B没有
		if(aRoot == null)return false;
		
		//如果当前节点相同,进行进一步对比;
		//对比的结果可能是false,此时继续向下检查aRoot.left与bRoot、aRoot.right与bRoot
		if(aRoot.val == bRoot.val){
			return (isChild2(aRoot.left, bRoot.left) && isChild2(aRoot.right, bRoot.right))
					|| isChild2(aRoot.left, bRoot)
					|| isChild2(aRoot.right, bRoot);
		}else{//如果当前节点不同,继续向下检查aRoot.left与bRoot、aRoot.right与bRoot
			return isChild2(aRoot.left, bRoot)
					|| isChild2(aRoot.right, bRoot);
		}
	}

关于剑指offer第二版面试题7:二叉树的下一个节点JAVA版本的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于LeetCode 剑指Offer 面试题27. 二叉树的镜像、[剑指Offer]55-题目一:二叉树的深度 题目二:平衡二叉树、《剑指Offer》-004 -Java版二叉树先序和中序遍历返回原二叉树、《剑指offer》面试题18 树的子结构 Java版等相关知识的信息别忘了在本站进行查找喔。

本文标签: