编程学习日志2019-02-25(1)(**求二叉树的深度**)

求二叉树的深度
C++

class Solution {
public:
    int TreeDepth(TreeNode* root) {
        if (root == NULL) return 0;

        return max(TreeDepth(root->left), TreeDepth(root->right)) + 1;
    }
};

上面为参考代码
下面为实际遇到的一些问题,
首先是root == NULL 的问题,NULL在C++11之后的版本是不推荐使用的,官方给出的解决办法是利用nullptr,下面是Primer第五版原话:
过去的程序还会用到一个名为NULL的预处理变量(preprocessor variable)来给指针赋值,这个变量在头文件cstdlib中定义,它的值就是0。
当用到一个预处理变量时,预处理器会自动地将它替换成实际值,因此用NULL初始化指针和用0初始化指针是一样的。在新标准下,现在C++程序最好使用nullptr,同时尽量避免使用NULL。

第二个问题是函数max()的问题,VS不支持max()
标准库在头中定义了两个模板函数std::min() 和 std::max()。通常用它可以计算某个值对的最小值和最大值。

可惜在 Visual C++ 无法使用它们,因为没有定义这些函数模板。原因是名字min和max与<windows.h>中传统的min/max宏定义有冲突。为了解决这个问题,Visual C++ 定义了另外两个功能相同的模板:_cpp_min() 和 _cpp_max()。我们可以用它们来代替std::min() 和 std::max()。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,我们需要定义二叉树的节点结构体: ```c struct TreeNode { char val; // 存储操作符或数字 struct TreeNode* left; struct TreeNode* right; }; ``` 然后,我们定义一个函数 `buildTree(char* s)`,将表达式字符串 `s` 存入二叉树中: ```c struct TreeNode* buildTree(char* s) { struct TreeNode* root = NULL; struct TreeNode* cur = NULL; struct TreeNode* stack[100]; int top = -1; int num = 0; // 存储数字,用于处理多位数字的情况 int flag = 1; // 标记当前数字的正负性,默认为正数 for (int i = 0; s[i] != '\0'; i++) { if (s[i] >= '0' && s[i] <= '9') { // 处理数字 num = num * 10 + s[i] - '0'; } else { // 处理操作符 if (flag == -1) { num = -num; flag = 1; } if (cur == NULL) { // 第一个节点 cur = (struct TreeNode*)malloc(sizeof(struct TreeNode)); cur->val = num; root = cur; } else if (cur->left == NULL) { // 左子节点 cur->left = (struct TreeNode*)malloc(sizeof(struct TreeNode)); cur->left->val = num; cur = cur->left; } else if (cur->right == NULL) { // 右子节点 cur->right = (struct TreeNode*)malloc(sizeof(struct TreeNode)); cur->right->val = num; cur = cur->right; } else { // 如果当前节点已经有左右子节点,则需要回溯到最近的未满的父节点 while (cur->right != NULL) { cur = stack[top--]; } cur->right = (struct TreeNode*)malloc(sizeof(struct TreeNode)); cur->right->val = num; cur = cur->right; } num = 0; // 清零num,准备处理下一个数字 if (s[i] == '-') { flag = -1; } else { cur->val = s[i]; } } // 将当前节点入栈 if (cur != NULL && (cur->val == '+' || cur->val == '-' || cur->val == '*' || cur->val == '/')) { stack[++top] = cur; } } if (flag == -1) { num = -num; } cur->val = num; // 处理最后一个数字 return root; } ``` 接着,我们定义一个函数 `evalTree(struct TreeNode* root)`,二叉树表达式的值: ```c int evalTree(struct TreeNode* root) { if (root == NULL) { return 0; } if (root->left == NULL && root->right == NULL) { // 叶子节点为数字 return root->val; } int leftVal = evalTree(root->left); int rightVal = evalTree(root->right); switch (root->val) { case '+': return leftVal + rightVal; case '-': return leftVal - rightVal; case '*': return leftVal * rightVal; case '/': return leftVal / rightVal; default: return 0; } } ``` 最后,我们可以使用以下代码进行测试: ```c int main() { char s[] = "1+2*3-4/5"; struct TreeNode* root = buildTree(s); int res = evalTree(root); printf("%s=%d\n", s, res); return 0; } ``` 输出结果为: ``` 1+2*3-4/5=6 ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值