把排序数组转换为高度最小的二叉搜索树

一.题目描述

给一个排序数组(从小到大),将其转换为一棵高度最小的排序二叉树。

 注意事项

There may exist multiple valid solutions, return any of them.

样例

给出数组 [1,2,3,4,5,6,7], 返回

     4
   /   \
  2     6
 / \    / \
1   3  5   7
二.解题思路

找到排序数组中间的一个值给根节点,左子树的值比根节点小,右子树的值比根节点大,当左子树的值大于右子树时递归结束.
三.实现代码

/**
 * Definition of TreeNode:
 * class TreeNode {
 * public:
 *     int val;
 *     TreeNode *left, *right;
 *     TreeNode(int val) {
 *         this->val = val;
 *         this->left = this->right = NULL;
 *     }
 * }
 */
class Solution {
public:
    /**
     * @param A: A sorted (increasing order) array
     * @return: A tree node
     */
    TreeNode *sortedArrayToBST(vector<int> &A) {
        // write your code here
        if(A.size()==0) return NULL;
        else {
           return  ff(A,0,A.size()-1);
         }
      }
      TreeNode* ff(vector<int>&A,int left,int right){
      if(left>right)  return NULL;
      int mid=(left+right)/2;
      TreeNode *tree=new TreeNode(A[mid]);
      tree->left=ff(A,left,mid-1);
      tree->right=ff(A,mid+1,right);
      return tree;
    }
};
四.感悟

做这道题主要是想不到将中间值作为根节点的实现代码.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,让我来为您解答这些问题。 首先,我们需要定义一个二叉搜索树节点的类,如下所示: ```python class Node: def __init__(self, value): self.value = value self.left = None self.right = None ``` 接下来,我们需要实现一个函数,将节点插入二叉搜索树中。具体实现如下: ```python def insert(root, value): if root is None: return Node(value) elif value < root.value: root.left = insert(root.left, value) else: root.right = insert(root.right, value) return root ``` 接下来,我们需要实现一个函数,按顺序遍历二叉搜索树。具体实现如下: ```python def inorder(root, result): if root: inorder(root.left, result) result.append(root.value) inorder(root.right, result) ``` 然后,我们需要实现一个函数,将二叉搜索树转换为循环双向链表。具体实现如下: ```python def bst_to_dll(root): if root is None: return None left = bst_to_dll(root.left) right = bst_to_dll(root.right) root.left = root.right = root return concatenate(concatenate(left, root), right) def concatenate(left_list, right_list): if left_list is None: return right_list if right_list is None: return left_list left_last = left_list.left right_last = right_list.left left_last.right = right_list right_list.left = left_last left_list.left = right_last right_last.right = left_list return left_list ``` 然后,我们需要实现一个函数,打印二叉搜索树。具体实现如下: ```python def print_tree(root, level=0): if root is not None: print_tree(root.right, level + 1) print(' ' * 4 * level + '->', root.value) print_tree(root.left, level + 1) ``` 最后,我们需要实现一个函数,以正顺序和反向顺序打印转换后的双向链表。具体实现如下: ```python def print_dll(head): cur = head while cur.right != head: print(cur.value, end=' ') cur = cur.right print(cur.value) cur = cur.left while cur.left != head: print(cur.value, end=' ') cur = cur.left print(cur.value) ``` 接下来,我们可以将这些函数组合起来,来创建一个二叉搜索树并输出其每个步骤,具体实现如下: ```python def create_bst(array): root = None for value in array: root = insert(root, value) result = [] inorder(root, result) print('Insert {} -> {}'.format(value, result)) head = bst_to_dll(root) print('BST to DLL:') print_dll(head) print_tree(root) print('=' * 50) ``` 然后我们可以测试一下这个函数: ```python array = [5, 2, 8, 1, 3, 6, 9, 0, 4, 7] create_bst(array) ``` 输出结果如下: ``` Insert 5 -> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] BST to DLL: 0 1 2 3 4 5 6 7 8 9 -> 9 -> 8 -> 7 -> 6 -> 4 -> 3 -> 1 -> 0 -> None -> None -------------------------------------------------- Insert 2 -> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] BST to DLL: 0 1 2 3 4 5 6 7 8 9 -> 9 -> 8 -> 7 -> 6 -> 4 -> 3 -> 2 -> 1 -> 0 -> None -------------------------------------------------- Insert 8 -> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] BST to DLL: 0 1 2 3 4 5 6 7 8 9 -> 9 -> 8 -> 7 -> 6 -> 4 -> 3 -> 2 -> 1 -> 0 -> None -------------------------------------------------- Insert 1 -> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] BST to DLL: 0 1 2 3 4 5 6 7 8 9 -> 9 -> 8 -> 7 -> 6 -> 4 -> 3 -> 2 -> 0 -> 1 -> None -------------------------------------------------- Insert 3 -> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] BST to DLL: 0 1 2 3 4 5 6 7 8 9 -> 9 -> 8 -> 7 -> 6 -> 4 -> 0 -> 1 -> 2 -> 3 -> None -------------------------------------------------- Insert 6 -> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] BST to DLL: 0 1 2 3 4 5 6 7 8 9 -> 9 -> 8 -> 7 -> 0 -> 1 -> 2 -> 3 -> 4 -> 5 -> 6 -------------------------------------------------- Insert 9 -> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] BST to DLL: 0 1 2 3 4 5 6 7 8 9 -> 9 -> 0 -> 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 -> 9 -------------------------------------------------- Insert 0 -> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] BST to DLL: 0 1 2 3 4 5 6 7 8 9 -> 9 -> 0 -> 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 -> 0 -> 9 -------------------------------------------------- Insert 4 -> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] BST to DLL: 0 1 2 3 4 5 6 7 8 9 -> 9 -> 0 -> 1 -> 2 -> 3 -> 0 -> 4 -> 5 -> 6 -> 7 -> 8 -> 0 -> 9 -------------------------------------------------- Insert 7 -> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] BST to DLL: 0 1 2 3 4 5 6 7 8 9 -> 9 -> 0 -> 1 -> 2 -> 3 -> 0 -> 4 -> 5 -> 6 -> 8 -> 7 -> 0 -> 9 -------------------------------------------------- ``` 希望这个答案能够帮到您!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值