您的位置:首页 > 其它

非递归实现二叉树的后序遍历、前序遍历、中序遍历

2017-10-16 17:15 543 查看
树的遍历可以用递归实现,一般情况下,能用递归解决的问题都可以用栈解决。

对于后续遍历,在父节点出栈时,需要判断左右孩子是否已经遍历过。可以定义一个新的结构体用于记录结点的左右孩子是否遍历过。

vector<int> postOrder(TreeNode *root)//后序遍历
{
vector<int> res;
if (root == NULL) return res;

TreeNode *p = root;
stack<TreeNode *> sta;
TreeNode *last = root;
sta.push(p);
while (!sta.empty())
{
p = sta.top();
if ((p->left == NULL && p->right == NULL) || (p->right == NULL && last == p->left) || (last == p->right))
{
res.push_back(p->val);
last = p;
sta.pop();
}
else
{
if (p->right)
sta.push(p->right);
if (p->left)
sta.push(p->left);
}

}

return res;
}

void preOrder_stack(Node root) {//先序遍历

Stack<Node> stack = new Stack<Node>();
Node node = root;

while (node|| !stack.empty()){//左孩子压栈
while (node) {//压栈之前先访问
printNode(node);
stack.push(node);
node = node.getLeftNode();

}
if(!stack.empty())
{
node = stack.pop();
node = node.getRightNode();
}
}
}

void inOrder_Stack(Node root) {//中序遍历

Stack<Node> stack = new Stack<Node>();
Node node = root;

while (node || !stack.empty()) {
while (node) {
stack.push(node);//直接压栈
node = node.getLeftNode();
}
if (!stack.empty()) {
node = stack.pop();//出栈并访问
printNode(node);
node = node.getRightNode();
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  二叉树 遍历 递归
相关文章推荐