二叉树 先序遍历 中序遍历 后序遍历 层次遍历 层次遍历换行

先序遍历

非递归:

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;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值