📜  在二叉树的后遍历中查找第n个节点(1)

📅  最后修改于: 2023-12-03 14:51:23.657000             🧑  作者: Mango

在二叉树的后遍历中查找第n个节点

在二叉树的后遍历中,每个节点的访问顺序是左子树->右子树->根节点。因此,如果要查找第n个节点,需要用后遍历的方式遍历二叉树。

下面用C++代码来实现在二叉树的后遍历中查找第n个节点的算法:

/* Definition for a binary tree node. */
struct TreeNode {
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};

class Solution {
public:
    int index; // 当前查找的节点是第几个
    TreeNode* res; // 查找到的第n个节点

    void postorder(TreeNode* root, int n) { // 后遍历二叉树
        if (root) {
            postorder(root->left, n);
            postorder(root->right, n);
            index++; // 记录当前查找的节点是第几个
            if (index == n) {
                res = root; // 找到第n个节点了,更新res
            }
        }
    }

    TreeNode* findNthNode(TreeNode* root, int n) {
        index = 0; // 初始化index
        res = nullptr; // 初始化res

        postorder(root, n);

        return res;
    }
};

时间复杂度为O(n),其中n为二叉树的节点数。

使用方法如下:

TreeNode* root = new TreeNode(1);
root->left = new TreeNode(2);
root->right = new TreeNode(3);
root->left->left = new TreeNode(4);
root->left->right = new TreeNode(5);

Solution s;
TreeNode* res = s.findNthNode(root, 3);
if (res) {
    cout << res->val << endl; // 输出3
} else {
    cout << "Not found!" << endl;
}

以上就是在二叉树的后遍历中查找第n个节点的算法介绍。