二叉树先序遍历(包含递归和非递归(2种方法))

来源:互联网 发布:cpu故障检测软件 编辑:程序博客网 时间:2024/06/07 06:36

二叉树先序遍历:中 左 右

二叉树中序遍历: 左 中 右

二叉树后序遍历: 左 右 中

本文以二叉树的先序遍历为例,讲解递归和非递归两种方法求解。

首先给出二叉树节点的结构

struct Node {

int  value;

Node left;

Node right;

Node(int x)  {this.value = x;}

};

例:二叉树如图所示

1

        /     \

 2          3

      /     \      /       \

    4      5   6       7

1. 递归求解方法比较简单如下所示:

打印二叉树的先序遍历结果

void  PreOrder(Node head) {

std::cout<<head.value<<" ";

PreOrder(head.left);//递归打印左子树

PreOrder(head.right);//递归打印子树

}

2.非递归求解

  (1). 使用stack来实现。首先将head压入栈,每次将栈顶元素弹出,记为cur,打印cur的值。然后,如果右节点不为空,将cur的右节点压入栈,如果左节点不为空,将其左节点压入栈,当栈为空时循环结束!   本方法是在出栈的时候实现打印输出。

void preOrder(Node head) {

stack<Node> s;

s.push(head);

while(!s.empty()) {

Node temp = s.top();

s.pop();

std::cout<<temp.value<<std::endl;

if( temp.right) s.push(temp.right);

if( temp.left) s.push(temp.left);

}

}

  (2). 还是使用stack.不过这个稍微不同,是先将所有的最左节点入栈,例如1,2,4先入栈,然后将栈顶元素弹出,并记为cur,如果cur的右节点不为空,则将右节点入栈,并循环将右节点的左子节点入栈。此方法是入栈时打印输出节点值。此方法依据先序遍历 1 2 4 5 3 6 7的顺序,依次入栈。 

void preOrder(Node head) {

stack<Node> s;

while(head) {

s.push(head);

std::cout<<head.value<<std::endl;

head = head.left;

}

while(!s.empty()) {

Node temp = s.top().right;

s.pop();

while (temp) {

s.push(temp);

std::cout<<temp.value<<std::endl;

temp = temp.left;

}

}

}


0 0