学习树这种数据结构的意义(我为何要学?)
1)树这种数据结构的提出意义在于:分层次组织数据,这样在数据的管理上会更有效率,主要在于数据的查找。(优化数据的查找速度(对付大规模数据的处理),比如平衡二叉树,红黑树啥的应用)
2)树的推广就是图,可以说,树就是一种特殊的图。
二叉树的前序遍历
1)递归写法(习惯递归这种技巧,强化)
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
vector<int> rt;
void func(TreeNode* root)
{
//递归边界
if(NULL==root)
{
return;
}
rt.push_back(root->val);
func(root->left);
func(root->right);
}
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
rt.clear();
func(root);
return rt;
}
};
2)非递归写法一(重点掌握,防止爆内存栈)——借助栈实现
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
vector<int> rt;
if(NULL==root)
{
return rt;//程序健壮性
}
stack<TreeNode*> st;
st.push(root);
//当栈非空
while(!st.empty())
{
TreeNode* pre=st.top();
rt.push_back(pre->val);
st.pop();
//注意,因为我们前序遍历对左边的访问要先于右边
//后入栈的会先出栈,所以,我们先放入右边的指针。
if(NULL!=(pre->right))
{
st.push(pre->right);
}
if(NULL!=(pre->left))
{
st.push(pre->left);
}
}
return rt;
}
};
3)非递归写法二——线索化二叉树
实际做OJ的时候,这种解法可能有局限,毕竟要修改结构体。
新增两个指针。