mybloger

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

45、二叉树转成单链表

image-20250623201844405

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public void flatten(TreeNode root) {
        List<TreeNode> list = new ArrayList<TreeNode>();
        preorderTraversal(root,list);
        int size = list.size();
        for (int i = 1;i < size;i++) {
            TreeNode prev = list.get(i - 1),curr = list.get(i);
            prev.left = null;
            prev.right = curr;
        }
    }

    public void preorderTraversal(TreeNode root,List<TreeNode> list) {
        if (root != null) {
            list.add(root);
            preorderTraversal(root.left,list);
            preorderTraversal(root.right,list);
        }
    }
}

46、从前序与中序遍历序列构造二叉树

image-20250623211912360

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {

    private Map<Integer,Integer> indexMap;

    public TreeNode myBuildTree(int[] preorder,int[] inorder,
        int preorder_left,int preorder_right,int inorder_left,int inorder_right) {
            if (preorder_left > preorder_right) {
                return null;
            }

            // 前序遍历中的第一个节点就是根节点
            int preorder_root = preorder_left;
            // 在中序遍历定位根节点
            int inorder_root = indexMap.get(preorder[preorder_root]);

            // 先把根节点建立出来
            TreeNode root = new TreeNode(preorder[preorder_root]);
            // 得到左子树中的节点数目
            int size_left_subtree = inorder_root - inorder_left;
            // 递归遍历构造左子树,并连接到根节点
            root.left = myBuildTree(preorder,inorder,preorder_left + 1,
            preorder_left + size_left_subtree,inorder_left,inorder_root - 1);

            root.right = myBuildTree(preorder,inorder,preorder_left + size_left_subtree + 1,
            preorder_right,inorder_root + 1,inorder_right);

            return root;

        }

        public TreeNode buildTree(int[] preorder,int[] inorder) {
            int n = preorder.length;
            // 构造哈希映射,帮助我们快速定位根节点
            indexMap = new HashMap<Integer,Integer>();
            for (int i = 0;i < n;i++) {
                indexMap.put(inorder[i],i);
            }
            return myBuildTree(preorder,inorder,0,n - 1,0,n - 1);
        }
}
posted on 2025-06-23 21:20  万能包哥  阅读(9)  评论(0)    收藏  举报