二叉树遍历 递归与非递归 先序-中序-后序

来源:互联网 发布:怎样使用办公软件 编辑:程序博客网 时间:2024/05/29 13:56

题目:

分别用递归和非递归的方式实现二叉树先序、中序、后序遍历!

二叉树节点结构

struct TreeNode{int val;TreeNode *left;TreeNode *right;TreeNode(int v) :val(v), left(NULL), right(NULL){}};

先序遍历

递归实现

/*递归先序遍历*/void preOrderRecur(TreeNode *tree){if (!tree)return;cout << tree->val << "\t";preOrderRecur(tree->left);preOrderRecur(tree->right);}

非递归实现

/*非递归实现先序遍历*/void preOrderUnRecur(TreeNode *tree){if (!tree)return;stack<TreeNode *> stk;/*压入根节点*/stk.push(tree);while (!stk.empty()){TreeNode *tmp = stk.top();cout << tmp->val << "\t";stk.pop();/*先压入栈右子树节点,再压入栈左子树节点*/if (tmp->right)stk.push(tmp->right);if (tmp->left)stk.push(tmp->left);}//while}

中序遍历

递归实现

/*递归实现中序遍历*/void inOrderRecur(TreeNode *tree){if (!tree)return;inOrderRecur(tree->left);cout << tree->val << "\t";inOrderRecur(tree->right);}

非递归实现

/*非递归实现中序遍历*/void inOrderUnRecur(TreeNode *tree){if (!tree)return;stack<TreeNode *> stk;TreeNode *cur = tree;while (!stk.empty() || cur){if (cur){stk.push(cur);cur = cur->left;}//ifelse{cur = stk.top();stk.pop();cout << cur->val << "\t";cur = cur->right;}//else}//while}

后序遍历

递归实现

/*递归实现后序遍历*/void postOrderRecur(TreeNode *tree){if (!tree)return;postOrderRecur(tree->left);postOrderRecur(tree->right);cout << tree->val << "\t";}

非递归实现1

/*非递归实现后序遍历1*/void postOrderRecur1(TreeNode *tree){if (!tree)return;/*两个辅助栈*/stack<TreeNode *> stk1;stack<TreeNode *> stk2;stk1.push(tree);while (!stk1.empty()){TreeNode *tmp = stk1.top();stk1.pop();if (tmp->left)stk1.push(tmp->left);if (tmp->right)stk1.push(tmp->right);stk2.push(tmp);}//whilewhile (!stk2.empty()){cout << stk2.top()->val << "\t";stk2.pop();}//while}

非递归实现方式2

/*非递归实现后序遍历2*/void postOrderRecur2(TreeNode *h){if (!h)return;/*实现过程中,h代表最近一次弹出并打印的节点*/stack<TreeNode *> stk;stk.push(h);TreeNode *tmp;while (!stk.empty()){/*tmp代表栈顶节点*/tmp = stk.top();if (tmp->left && h != tmp->left && h != tmp->right){stk.push(tmp->left);}//elseelse if (tmp->right && h != tmp->right){stk.push(tmp->right);}//elifelse{cout << tmp->val << "\t";stk.pop();h = tmp;}//else}//while}

完整程序GitHub网址








1 0