019重建二叉树
题目描述

给定节点数为 n 的二叉树的前序遍历和中序遍历结果,请重建出该二叉树并返回它的头结点。
例如输入前序遍历序列{
   1,2,4,7,3,5,6,8}和中序遍历序列{
   4,7,2,1,5,3,8,6},则重建出如下图所示。

在这里插入图片描述

关键解题思路
前序遍历:根左右; 中序遍历:左根右
递归:终止条件、返回值、本级任务
前序遍历找到根节点,在根据中序遍历划分左右子树,使用递归进行这个过程就可以建树。
注意:使用Arrays.copyofRange(原数组,左界限,有界限(不包含))。
Solution

import java.util.*;

/* * public class TreeNode { * int val = 0; * TreeNode left = null; * TreeNode right = null; * public TreeNode(int val) { * this.val = val; * } * } */

public class Solution {
   
    /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param preOrder int整型一维数组 * @param vinOrder int整型一维数组 * @return TreeNode类 */
    public TreeNode reConstructBinaryTree (int[] preOrder, int[] vinOrder) {
   
        // write code here
        //递归:终止条件、返回值,本级任务
        //preorder的第一个值为头节点的值
        if(preOrder.length==0){
   
            return null;
        }
        if(preOrder.length==1){
   
            return new TreeNode(preOrder[0]);
        }
        int prenodeval = preOrder[0];
        TreeNode treenode= new TreeNode(prenodeval);
        int j=0;
        for(; j<vinOrder.length;j++){
   
            if(vinOrder[j]==prenodeval){
   
                break;
            }
        }
        treenode.left = reConstructBinaryTree(Arrays.copyOfRange(preOrder,1,j+1), Arrays.copyOfRange(vinOrder,0,j));
        treenode.right= reConstructBinaryTree(Arrays.copyOfRange(preOrder,j+1,preOrder.length), Arrays.copyOfRange(vinOrder,j+1,vinOrder.length));
        return treenode;
    }
}

020二叉树的下一个结点
题目描述

给定一个二叉树其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的next指针。下图为一棵有9个节点的二叉树。树中从父节点指向子节点的指针用实线表示,从子节点指向父节点的用虚线表示

在这里插入图片描述
关键解题思路
1、使用next找到根节点
2、递归,得到二叉树的中序遍历
3、根据2得到的中序遍历获得匹配的节点
Solution

import java.util.*;
/* public class TreeLinkNode { int val; TreeLinkNode left = null; TreeLinkNode right = null; TreeLinkNode next = null; TreeLinkNode(int val) { this.val = val; } } */
public class Solution {
   
    ArrayList<TreeLinkNode> nodes = new ArrayList<>(); 
    public TreeLinkNode GetNext(TreeLinkNode pNode) {
   
        //1、找到根节点
        //2、递归,得到二叉树的中序遍历
        //3、根据中序遍历顺序,找到匹配的节点
       TreeLinkNode root =pNode;
       while(root.next!=null){
   
            root = root.next;
       }
       Order(root);
       for(int i=0;i<nodes.size()-1; i++){
   
            if(nodes.get(i)==pNode){
   
                return nodes.get(i+1);
            }
       }
        return null ;
        
    }
    void Order(TreeLinkNode root){
   
        if(root!=null){
   
            Order(root.left);
            nodes.add(root);
            Order(root.right);
        }
    }
}