leetcode-019-1028. 从先序遍历还原二叉树


刷题的速度太慢,一下午就写了一题,坑坑绊绊的。

  1. 对 C++ 语言掌握的不好
  2. 对问题的理解缺失不彻底
  3. 在写 code 的时候,思路不够清晰

我们从二叉树的根节点 root 开始进行深度优先搜索。

在遍历中的每个节点处,我们输出 D 条短划线(其中 D 是该节点的深度),然后输出该节点的值。(如果节点的深度为 D,则其直接子节点的深度为 D + 1。根节点的深度为 0)。

如果节点只有一个子节点,那么保证该子节点为左子节点。

给出遍历输出 S,还原树并返回其根节点 root。

 

示例 1:

输入:"1-2--3--4-5--6--7"
输出:[1,2,5,3,4,6,7]

示例 2:

输入:"1-2--3---4-5--6---7"
输出:[1,2,5,3,null,6,null,4,null,7]

示例 3:

输入:"1-401--349---90--88"
输出:[1,401,null,349,88,90]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/recover-a-tree-from-preorder-traversal
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
【缺少原图】
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    string s;
    int idx;
    void bulitTree(TreeNode** p, int deep) {
        int cur_deep = 0;
        while(idx<s.size())
            if(s[idx] == '-')
                cur_deep++, idx++;
            else
                break;


        if(cur_deep != deep) {
            *p = NULL;
            idx = idx - cur_deep;
            return;
        }
        else {
            string tmp = "";
            while(idx < s.size())
                if(s[idx]=='-')
                    break;
                else
                    tmp += s[idx++];
            (*p) = new TreeNode;
            (*p)->val = atoi(tmp.c_str());
            cout << (*p)->val << endl;
        }
     
        bulitTree(&((*p)->left), deep+1);
        bulitTree(&((*p)->right), deep+1);
    }

    TreeNode* recoverFromPreorder(string S) {
        s = S;
        TreeNode* root;
        bulitTree(&root, 0);
        return root;
    }
};

带着 deep 树的深度值 进行遍历,更多的工作还是用在了字符串 split。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对称二叉树是从根节点开始,访问根节点,然后按照左后右的顺递归遍左子树和右子树。这里引用的方法有三种思路实现,其中思路1是最基本的实现方式,通过递归的方式遍两次树来判断是否对称。思路1的方法会导致整体上遍了这棵树两次,但实际上只需要比较到两个遍节点相遇时即可停止,因为后续的比较结果和前面是完全一致的。所以,对于给定的对称二叉树只需要比较到两个遍节点相遇时即可停止。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [leetcode:Leetcode的解决方案,用JAVA编写](https://download.csdn.net/download/weixin_42121412/19697315)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [[树] 101. 对称二叉树(前 + 方法优化)](https://blog.csdn.net/m0_38142029/article/details/108089313)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值