参考
先序遍历
法一
void dlr(TreeNode* root) {
if(!root) return;
stack<TreeNode*> stk;
stk.push(root);
while(!stk.empty()){
TreeNode *node = stk.top();
cout << node->val << ' ';
stk.pop();
if(node->right)
stk.push(node->right);
if(node->left)
stk.push(node->left);
}
}
法二
void dlr(TreeNode* root) {
stack<TreeNode*> stk;
while(root != NULL || !stk.empty()){
if(root != NULL){
stk.push(root);
cout << root->val << ' ';
root = root->left;
}else{
root = stk.top();
stk.pop();
root = root->right;
}
}
}
中序遍历
void ldr(TreeNode* root) {
stack<TreeNode*> stk;
while(root != NULL || !stk.empty()){
if(root != NULL){
stk.push(root);
root = root->left;
}else{
root = stk.top();
cout << root->val << ' ';
stk.pop();
root = root->right;
}
}
}
后序遍历
法一:不改变树本身结构
void lrd(TreeNode* root) {
if(!root) return;
stack<TreeNode*> stk, output;
stk.push(root);
while(!stk.empty()){
TreeNode *node = stk.top();
output.push(node);
stk.pop();
if(node->left)
stk.push(node->left);
if(node->right)
stk.push(node->right);
}
while(!output.empty()){
cout << output.top()->val << ' ';
output.pop();
}
}
法二:改变树本身的结构
void lrd(TreeNode* root)
{
stack<TreeNode*> stk;
while (root || !stk.empty())
{
if (root)
{
stk.push(root);
root = root->left;
}
else
{
TreeNode *tmp = stk.top();
root = tmp->right;
if (!root)
{
stk.pop();
cout << tmp->val << ' ';
}
else
{
tmp->right = nullptr;
}
}
}
return postorder;
}
层序遍历
void level(TreeNode* root) {
if(!root) return;
queue<TreeNode*> q;
q.push(root);
while(!q.empty()){
for(int i = 0, n = q.size(); i < n; i++){
TreeNode *node = q.front();
if(node->left)
q.push(node->left);
if(node->right)
q.push(node->right);
cout << node->val << ' ';
q.pop();
}
}
}