先序遍历
非递归:
1申请一个栈 记为stk
2然后将根节点压入stk中
3每次从stk中弹出栈顶节点,记为cur 然后打印cur的值 如果cur的右子树不为空,将cur的右子树压入stk中。如果cur的左子树不为空 将cur的左子树压入stk中 不断重复次步骤3直到stk为空循环 结束
voidthree::PreOrder()
{
if(root== nullptr)
return;
stack<Node*>stk;
stk.push(root);
while(!stk.empty()) {
Node*cur = stk.top();
cout<< cur->key << endl;
stk.pop();
if(cur->right != nullptr)
stk.push(cur->right);
if(cur->left != nullptr)
stk.push(cur->left);
}
}
递归:
cout<<root->key;
PreOrder(root->left);
PreOrder(root->right);
中序遍历
非递归
1.申请一个栈记为stk,申请一个变量cur,cur被根节点初始化
2.先把cur节点压入栈中,对以cur节点为根节点的整棵子树,依次把整棵树的左边界压入到栈中,既不断的执行 stk.push(cur); cur =cur->left,直到cur为空停止本次循环.
3.上面循环停止后,弹出栈顶结点,记录为node,打印node,并且让cur = node->right;然后继续重复步骤2
4.直到stk为空并且cur 也为空时,停止整个循环.
voidthree::PreOrder()
{
if(root == nullptr)
return;
stack<Node*>stk;
Node*cur = root;
while(!stk.empty() || cur != nullptr) {
while(cur != nullptr) {
stk.push(cur);
cur= cur->left;
}
Node*node = stk.top();
stk.pop();
cout<< node->key << " ";
cur= node->right;
}
}
(进阶版)
if(root == nullptr)
return;
stack<Node*>stk;
Node* cur = root;
while(!stk.empty()||cur!=nullptr) {
if(cur != nullptr) {
stk.push(cur);
cur= cur->left;
}
else{
cur= stk.top();
stk.pop();
cout<< cur->key << " ";
cur= cur->right;
}
}
递归:
PreOrder(root->left);
cout<<root->key;
PreOrder(root->right);
后序遍历
非递归:
1.申请两个栈,记为s1和s2 然后将根结点压入s1中
2.从s1中弹出的节点记为cur,然后先把cur的左子树压入到s1中,然后把cur的右子 树压到s1中
3.上一步的整个过程中,每一个从s1中弹出的节点都放进s2中
4.不断重复步骤2和步骤3,直到s1为空 整个过程结束
if (root == nullptr)
return;
stack<Node*>stk1;
stack<Node*>stk2;
stk1.push(root);
while(!stk1.empty()) {
Node*cur = stk1.top();
stk2.push(cur);
stk1.pop();
if(cur->left)
stk1.push(cur->left);
if(cur->right)
stk1.push(cur->right);
}
while(!stk2.empty()) {
cout<< stk2.top()->key<<" ";
stk2.pop();
}
递归:
PreOrder(root->left);
PreOrder(root->right);
cout<<root->key;
层次遍历
1.创建一个队列记为que 将跟节点放入队列
2.每次从队列中弹出一个节点 记为node
3.第三步看这个node有没有左孩子,如果有左孩子把左孩子放入到队列中 如果node有右孩子 把右孩子放入到队列中
4.重复2和3 直到队列为空
非换行
if (root == nullptr)
return;
queue<Node*>que;
que.push(root);
while(!que.empty()) {
Node*node = que.front();
que.pop();
cout<< node->key << " ";
if(node->left)
que.push(node->left);
if(node->right)
que.push(node->right);
}
换行
if (root == nullptr)
return;
queue<Node*>que;
que.push(root);
while (!que.empty()){
intn = que.size();
for(int i = 0; i < n; i++) {
Node*node = que.front();
que.pop();
cout<< node->key << " ";
if(node->left)
que.push(node->left);
if(node->right)
que.push(node->right);
}
cout<< endl;
}
36万+

被折叠的 条评论
为什么被折叠?



