91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

c++二叉樹怎么建立與遍歷

c++
小億
86
2023-12-13 16:55:08
欄目: 編程語言

建立二叉樹: 可以使用遞歸或者迭代的方式來建立二叉樹。

遞歸方式建立二叉樹:

  1. 創建一個二叉樹節點結構,包含一個值和指向左右子節點的指針。
  2. 使用遞歸的方式,先建立左子樹,再建立右子樹。
  3. 根據具體需求,確定遞歸的終止條件。

示例代碼如下:

struct TreeNode {
    int val;
    TreeNode* left;
    TreeNode* right;
    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};

TreeNode* buildTree(vector<int>& nums, int start, int end) {
    if (start > end) {
        return nullptr;
    }
    
    int mid = start + (end - start) / 2;
    TreeNode* root = new TreeNode(nums[mid]);
    root->left = buildTree(nums, start, mid - 1);
    root->right = buildTree(nums, mid + 1, end);
    
    return root;
}

TreeNode* buildBinaryTree(vector<int>& nums) {
    return buildTree(nums, 0, nums.size() - 1);
}

迭代方式建立二叉樹:

  1. 創建一個二叉樹節點結構,包含一個值和指向左右子節點的指針。
  2. 使用一個隊列來輔助建立二叉樹。從根節點開始,依次將左右子節點入隊列。
  3. 根據具體需求,確定迭代的終止條件。

示例代碼如下:

struct TreeNode {
    int val;
    TreeNode* left;
    TreeNode* right;
    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};

TreeNode* buildBinaryTree(vector<int>& nums) {
    if (nums.empty()) {
        return nullptr;
    }
    
    TreeNode* root = new TreeNode(nums[0]);
    queue<TreeNode*> q;
    q.push(root);
    
    int i = 1;
    while (i < nums.size()) {
        TreeNode* node = q.front();
        q.pop();
        
        if (i < nums.size() && nums[i] != -1) {
            node->left = new TreeNode(nums[i]);
            q.push(node->left);
        }
        
        i++;
        
        if (i < nums.size() && nums[i] != -1) {
            node->right = new TreeNode(nums[i]);
            q.push(node->right);
        }
        
        i++;
    }
    
    return root;
}

遍歷二叉樹: 常見的二叉樹遍歷方式有前序遍歷、中序遍歷和后序遍歷。

前序遍歷(根左右):

  1. 訪問根節點。
  2. 遞歸地前序遍歷左子樹。
  3. 遞歸地前序遍歷右子樹。

示例代碼如下:

void preorderTraversal(TreeNode* root) {
    if (root == nullptr) {
        return;
    }
    
    // 訪問根節點
    cout << root->val << " ";
    
    // 前序遍歷左子樹
    preorderTraversal(root->left);
    
    // 前序遍歷右子樹
    preorderTraversal(root->right);
}

中序遍歷(左根右):

  1. 遞歸地中序遍歷左子樹。
  2. 訪問根節點。
  3. 遞歸地中序遍歷右子樹。

示例代碼如下:

void inorderTraversal(TreeNode* root) {
    if (root == nullptr) {
        return;
    }
    
    // 中序遍歷左子樹
    inorderTraversal(root->left);
    
    // 訪問根節點
    cout << root->val << " ";
    
    // 中序遍歷右子樹
    inorderTraversal(root->right);
}

后序遍歷(左右根):

  1. 遞歸地后序遍歷左子樹。
  2. 遞歸地后序遍歷右子樹。
  3. 訪問根節點。

示例代碼如下:

void postorderTraversal(TreeNode* root) {
    if (root == nullptr) {
        return;

0
淅川县| 德江县| 奉贤区| 彭泽县| 筠连县| 历史| 岳普湖县| 专栏| 中宁县| 肥城市| 洪泽县| 民丰县| 宝兴县| 阿克| 古丈县| 定陶县| 镇巴县| 女性| 嘉善县| 荔浦县| 乡宁县| 调兵山市| 大丰市| 云霄县| 从化市| 云安县| 阿尔山市| 安西县| 凤翔县| 海南省| 丰城市| 壶关县| 和田市| 淮滨县| 苍南县| 大埔区| 防城港市| 阆中市| 青冈县| 手游| 长沙市|