博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【LeetCode】94. Binary Tree Inorder Traversal (3 solutions)
阅读量:7106 次
发布时间:2019-06-28

本文共 3091 字,大约阅读时间需要 10 分钟。

Binary Tree Inorder Traversal

Given a binary tree, return the inorder traversal of its nodes' values.

For example:

Given binary tree {1,#,2,3},

1    \     2    /   3

 

return [1,3,2].

Note: Recursive solution is trivial, could you do it iteratively?

 

解法一:递归

/** * Definition for binary tree * struct TreeNode { *     int val; *     TreeNode *left; *     TreeNode *right; *     TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public:    vector
inorderTraversal(TreeNode *root) { vector
ret; if(!root) return ret; inorder(root, ret); return ret; } void inorder(TreeNode* root, vector
& ret) { if(root->left) inorder(root->left, ret); ret.push_back(root->val); if(root->right) inorder(root->right, ret); }};

 

解法二:非递归

使用map记录是否访问过,使用栈记录访问路径,访问过就出栈。

遵循左根右原则。

/** * Definition for binary tree * struct TreeNode { *     int val; *     TreeNode *left; *     TreeNode *right; *     TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public:    vector
inorderTraversal(TreeNode *root) { vector
ret; if(!root) return ret; stack
stk; unordered_map
m; stk.push(root); m[root] = true; while(!stk.empty()) { TreeNode* top = stk.top(); if(top->left) { if(m[top->left] == false) { stk.push(top->left); m[top->left] = true; continue; } } ret.push_back(top->val); stk.pop(); if(top->right) { if(m[top->right] == false) { stk.push(top->right); m[top->right] = true; } } } return ret; }};

 

解法三:非递归,不需要除栈之外的空间

每次新加入节点时,将左子节点(比当前节点小)全部进栈,这样在出栈的时候就不需要再去访问左子节点,

只需要访问右子节点(比当前节点大)

/** * 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:    vector
inorderTraversal(TreeNode* root) { vector
ret; if(root == NULL) return ret; stack
stk; stk.push(root); TreeNode* cur = root; while(cur->left) { stk.push(cur->left); cur = cur->left; } while(!stk.empty()) { TreeNode* top = stk.top(); stk.pop(); ret.push_back(top->val); if(top->right) { TreeNode* cur = top->right; stk.push(cur); while(cur->left) { stk.push(cur->left); cur = cur->left; } } } return ret; }};

转载地址:http://qxphl.baihongyu.com/

你可能感兴趣的文章
PHP eval() 函数
查看>>
提高软件质量实践——Facebook 篇
查看>>
SQLSERVER和ORACLE批量处理表名和字段名大写
查看>>
mysql日志设置优化
查看>>
关于异步加载、缓存图片、软引用等
查看>>
小心DataContractJsonSerializer和JavaScriptSerializer的内部实现差异
查看>>
VS2005 WebService 引用无法识别DataTable
查看>>
c/c++ 宏中"#"和"##"的用法
查看>>
TypeScript
查看>>
激发灵感:26个清爽的蓝色调网页设计作品欣赏
查看>>
理解UIApplication(转)
查看>>
JavaScript面向对象编程入门
查看>>
单机版数据库
查看>>
JavaScript调用系统exe文件
查看>>
spring(13)
查看>>
Java中的反射机制(三) 反射与数组
查看>>
${oid?c}的使用
查看>>
12306多种手段反击浏览器厂商“见招拆招”
查看>>
64位机器上编译
查看>>
WMI使用的WIN32_类库名 【转】
查看>>