遍历
1. 递归法 -- 前序遍历 (中序、后序类似)
void pre_order(TreeNode *node){
if(node!=nullptr){
cout<<node->data; //根
pre_order(node->left); //左
pre_order(node->right); //右
}
}
2. 循环法 -- 前序遍历
#include<stack>
void pre_order(TreeNode *node){
stack<TreeNode*> st;
while(node!=nullptr||!st.empty()){
if(node!=nullptr){ //节点存在时
cout<<node->data; //输出根
st.push(node); //根节点存入栈
node=node->left; //指向左节点
}
else{
TreeNode *parent=st.top(); //左节点不存在时,指向根右节点
st.pop();
node=parent->right;}
}
}
中序遍历
#include<stack>
void in_order(TreeNode *node){
stack<TreeNode*> st;
while(node!=nullptr||!st.empty()){
if(node!=nullptr){ //节点存在时
st.push(node); //根节点存入栈
node=node->left; //指向左节点
}
else{
TreeNode *parent=st.top(); //左节点不存在时,指向根右节点
cout<<parent->data; //输出根
st.pop();
node=parent->right;}
}
}