1. 程式人生 > >LeetCode701 二叉搜尋樹中插入結點

LeetCode701 二叉搜尋樹中插入結點

給定二叉搜尋樹(BST)的根節點和要插入樹中的值,將值插入二叉搜尋樹。 返回插入後二叉搜尋樹的根節點。 保證原始二叉搜尋樹中不存在新值。

注意,可能存在多種有效的插入方式,只要樹在插入後仍保持為二叉搜尋樹即可。 你可以返回任意有效的結果。

例如, 

給定二叉搜尋樹:

        4
       / \
      2   7
     / \
    1   3

和 插入的值: 5

你可以返回這個二叉搜尋樹:

         4
       /   \
      2     7
     / \   /
    1   3 5

或者這個樹也是有效的:

         5
       /   \
      2     7
     / \   
    1   3
         \
          4




/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
/*
演算法思想: 遞迴的方法,由於二叉搜尋樹自帶二分的性質,那麼首先根結點比較,如果大於根結點值的話,說明肯定要插入到右子樹中。所以接下來跟7比較,對於遞迴函式來說,結點7也可以當作是一個新的根結點,那麼由於結點7的值大於目標值5,所以要去其左子樹,我們發現其左子結點為空,那麼我們就可以根據目標值來生成一個新的結點,然後連到結點7的左子樹上即可。那麼在遞迴函式中,首先判斷當前結點是否為空,為空的話就新建一個結點返回。否則就判斷目標值是否小於當前結點值,是的話就對左子結點呼叫遞迴函式,並將返回值賦給當前結點的左子結點,否則就對右子結點呼叫遞迴函式,並將返回值賦給當前結點的右子結點,最後返回當前結點即可。
*/ //演算法實現: class Solution { public: TreeNode* insertIntoBST(TreeNode* root, int val) { if (!root) return new TreeNode(val); if (val < root->val) //目標值小於當前結點值,對左子結點呼叫遞迴函式 root->left = insertIntoBST(root->left, val); else root->right = insertIntoBST(root->right, val); return root; } }; /* 演算法思想: 迭代的方法,首先還是判空,若為空,就新建結點返回。然後用一個變數cur來遍歷,在while迴圈中,如果當前值大於目標值,如果其左子結點不存在,那麼我們新建結點,並連上其左子結點,並跳出迴圈;若左子結點存在,則cur指向其左子結點。否則,當前值小於目標值,若其右子結點不存在,新建結點並連上其右子結點,並跳出迴圈;若右子結點存在,則cur指向其右子結點。最後返回root即可。 */ //演算法實現: class Solution { public: TreeNode* insertIntoBST(TreeNode* root, int val) { if (!root) return new TreeNode(val); TreeNode *cur = root; while (true) { if (cur->val > val) { if (!cur->left) { cur->left = new TreeNode(val); break; } cur = cur->left; } else { if (!cur->right) { cur->right = new TreeNode(val); break; } cur = cur->right; } } return root; } };