树的基本操作的非递归实现

简介:

树结点

 
  1. struct TreeNode { 
  2.  
  3.         int val; 
  4.         struct TreeNode *left; 
  5.         struct TreeNode *right; 
  6.         TreeNode(int x):val(x),left(NULL),right(NULL){} 
  7. }; 
  8. typedef struct TreeNode TreeNode; 
访问函数
 
 
  1. void visit(TreeNode *root) 
  2.         if(root) 
  3.                 cout <<root->val<<" "
 
 
前序递归

  1. void preorder(TreeNode *root)
  2.         if(root) 
  3.         { 
  4.                 visit(root); 
  5.                 preorder(root->left); 
  6.                 preorder(root->right); 
  7.         } 
前序非递归 
 
  1. void preorder1(TreeNode *root) 
  2.         stack<TreeNode*> s; 
  3.         while(root || !s.empty()) 
  4.         { 
  5.                 if(root) 
  6.                 { 
  7.                         visit(root); 
  8.                         s.push(root->right); 
  9.                         root = root->left; 
  10.                 } 
  11.                 else 
  12.                 { 
  13.                         root = s.top(); 
  14.                         s.pop(); 
  15.                 } 
  16.         } 
 
中序递归
 
 
  1. void inorder(TreeNode *root) 
  2.         if(root) 
  3.         { 
  4.                 inorder(root->left); 
  5.                 visit(root); 
  6.                 inorder(root->right); 
  7.         } 
中序非递归
 
 
  1. void inorder1(TreeNode *root) 
  2.         stack<TreeNode*> s; 
  3.         while(root || !s.empty()) 
  4.         { 
  5.                 if(root) 
  6.                 { 
  7.                         s.push(root); 
  8.                         root = root->left; 
  9.                 } 
  10.                 else 
  11.                 { 
  12.                         root = s.top(); 
  13.                         s.pop(); 
  14.                         visit(root); 
  15.                         root = root->right; 
  16.                 } 
  17.         } 
 
 
后序递归
 
 
  1. void postorder(TreeNode *root) 
  2.         if(root) 
  3.         { 
  4.                 postorder(root->left); 
  5.                 postorder(root->right); 
  6.                 visit(root); 
  7.         } 
后序非递归1,使用双栈
 
 
  1. void postorder1(TreeNode *root) 
  2.         stack<TreeNode*> s1; 
  3.         stack<TreeNode*> s2; 
  4.         if(!root) return
  5.         s1.push(root); 
  6.         while(!s1.empty()) 
  7.         { 
  8.                 s2.push(s1.top()); 
  9.                 s1.pop(); 
  10.                 if(s2.top()->left) 
  11.                         s1.push(s2.top()->left); 
  12.                 if(s2.top()->right) 
  13.                         s1.push(s2.top()->right); 
  14.         } 
  15.         while(!s2.empty()) 
  16.         { 
  17.                 visit(s2.top()); 
  18.                 s2.pop(); 
  19.         } 
后序非递归2,使用一个pre指针
 
 
  1. void postorder2(TreeNode *root) 
  2.         stack<TreeNode*> s; 
  3.         TreeNode *pre = NULL; 
  4.         TreeNode *cur; 
  5.         if(!root) return
  6.         s.push(root); 
  7.         while(!s.empty()) 
  8.         { 
  9.                 cur = s.top(); 
  10.                 if(!pre || (pre != cur->right && pre != cur->left)) 
  11.                 { 
  12.                         if(!cur->left && !cur->right) 
  13.                         { 
  14.                                 visit(cur); 
  15.                                 s.pop(); 
  16.                                 pre = cur; 
  17.                         } 
  18.                         if(cur->right) 
  19.                                 s.push(cur->right); 
  20.                         if(cur->left) 
  21.                                 s.push(cur->left); 
  22.                 } 
  23.  
  24.                 else if( pre == cur->left) 
  25.                 { 
  26.                         if(cur->right) 
  27.                                 s.push(cur->right); 
  28.                         else 
  29.                         { 
  30.                                 visit(cur); 
  31.                                 s.pop(); 
  32.                                 pre = cur; 
  33.                         } 
  34.                 } 
  35.                 else if(pre == cur->right) 
  36.                 { 
  37.                         visit(cur); 
  38.                         s.pop(); 
  39.                         pre = cur; 
  40.                 } 
  41.         } 
层次遍历,使用队列
 
 
  1. void level_traversal(TreeNode *root) 
  2.         queue<TreeNode*> q; 
  3.         if(!root) return
  4.         q.push(root); 
  5.         while(!q.empty()) 
  6.         { 
  7.                 if(q.front()->left) 
  8.                         q.push(q.front()->left); 
  9.                 if(q.front()->right) 
  10.                         q.push(q.front()->right); 
  11.                 visit(q.front()); 
  12.                 q.pop(); 
  13.         } 

(更新中)


本文转自nxlhero 51CTO博客,原文链接:http://blog.51cto.com/nxlhero/1159213,如需转载请自行联系原作者

相关文章
|
3月前
|
存储 算法
【二叉树】数据结构——BST二叉树基本概念及算法设计(插入、删除、遍历操作)
【二叉树】数据结构——BST二叉树基本概念及算法设计(插入、删除、遍历操作)
|
4月前
【数据结构】二叉树的三种遍历(非递归讲解)
【数据结构】二叉树的三种遍历(非递归讲解)
36 1
|
10月前
|
算法
【算法与数据结构】二叉树的三种遍历代码实现(下)—— 非递归方式实现(大量图解)
【算法与数据结构】二叉树的三种遍历代码实现(下)—— 非递归方式实现(大量图解)
64 0
|
Java
java实现树的前序遍历,递归和非递归实现(简单明了)
java实现树的前序遍历,递归和非递归实现(简单明了)
91 0
|
算法 C++
【栈的应用】二叉树非递归中序遍历思想解析及代码实现
【栈的应用】二叉树非递归中序遍历思想解析及代码实现
183 0
【栈的应用】二叉树非递归中序遍历思想解析及代码实现
|
算法 前端开发
理解和默写 二叉树的基本操作
理解和默写 二叉树的基本操作
92 0
二叉树的基本操作(二)
二叉树的基本操作(二)
二叉树的基本操作(二)
二叉树的基本操作
c++,先序遍历,中序遍历,后序遍历
|
存储 算法
非递归法创建二叉树
非递归法创建二叉树
303 0
非递归法创建二叉树