【二叉树】二叉树恢复操作

二叉树的操作(C++实现)

复制代码
/* Implement the function:
inorderTraversal: non-recursive version
Test:input P, T->buildTree->get the root-> output
*/
struct TreeNode {
    int val;
    TreeNode* left, *right;
    TreeNode(int x):val(x),left(NULL), right(NULL) {}
};

class Solution {
public:
    vector<int> inorderTraversal(TreeNode* root) {
        vector<int> result;
        if (root == NULL) return result;
        stack<TreeNode*> stk;
        TreeNode* p = root;
        while (p || !stk.empty()) {
            while (p) {
                stk.push(p);
                p = p->left;
            }
            p = stk.top();
            stk.pop();
            result.push_back(p->val);
            p = p->right;
        }
        return result;
    }
    // the following is used to generate test examples for inorderTraversal
    TreeNode* buildTree(vector<int> P, vector<int> T) {
        if (P.size() != T.size()) return NULL;
        int len = P.size();
        TreeNode* root = helper(P, T, 0, len - 1, 0, len - 1);
        return root;
    }
    // This is used for creating a tree by inputting preorder and inorder tree.
    TreeNode* helper(vector<int>& P, vector<int>& T, int pt, int pd, int st, int ed) {
        cout << "st ed = " << st << " " << ed << endl;
        cout << "pt pd = " << pt << " " << pd << endl;
        if (st > ed) return NULL;
        TreeNode* root = new TreeNode(0);
        int val = P[pt], len = P.size();
        for (int i = st; i <= ed; i++) {
            if (T[i] == val) {
                root->left = helper(P, T, pt + 1, pt + i - st, st, i - 1);
                root->val = val;
                root->right = helper(P, T, pt + i - st + 1, pd, i + 1, ed);
                break;
            }
        }
        return root;
    }
};
复制代码

测试

复制代码
int main() {
    int n;
    int t;
    while (cin >> n) {
        TreeNode* root = new TreeNode(0);
        Solution sol;
        Solution2 sol2;
        TreeNode* tree = root;
        vector<int> inorder(n, 0), preorder(n, 0);
        for (int i = 0; i < n; i++)  {
            cin >> preorder[i];
        }
        for (int i = 0; i < n; i++) {
            cin >> inorder[i];
        }
        TreeNode* root2 = sol2.buildTree(preorder, inorder);
        vector<int> res = sol2.inorderTraversal(root2);
        for (int i = 0; i < res.size(); i++) {
            cout << res[i] << " ";
        }
        cout << endl;
    }
    return 0;
}
/*
Sample Input:
5
2 3 4 7 9
4 3 2 7 9

Sample Output:
4 3 2 7 9
*/
复制代码

 

posted @   stackupdown  阅读(267)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示