中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

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
乐业县| 无极县| 隆林| 汝城县| 中西区| 万全县| 来宾市| 陆川县| 长垣县| 周宁县| 金坛市| 灌南县| 宿松县| 怀柔区| 洛隆县| 婺源县| 探索| 皮山县| 内黄县| 颍上县| 武威市| 拜泉县| 保康县| 珠海市| 邛崃市| 洛浦县| 奎屯市| 镇安县| 凤翔县| 乡城县| 东兴市| 乐业县| 合肥市| 陈巴尔虎旗| 沽源县| 石河子市| 绥阳县| 禹州市| 唐海县| 阳西县| 额尔古纳市|