对于二叉树,有前序、中序、后序三种遍历方法,由于树的定义本身就是递归定义的,故采用递归方法实现三种遍历简洁易懂。若采用非递归访问,则需要使用栈来模拟递归的实现。三种遍历的非递归算法中,前序和后序较容易,而后序相对较难。
前序遍历 | 递归 | 非递归 | |
树的遍历 | 中序遍历 | 递归 | 非递归 |
后序遍历 | 递归 | 非递归 | |
层次遍历 | |||
计算树高 | |||
计算结点数 |
- 前序遍历【访问顺序:根结点-左孩子-右孩子】
a> 前序遍历递归实现
1 void PreOrderRecursively(BinaryTreeNode *root) 2 {//递归前序遍历[根,左,右] 3 if(root != NULL) 4 { 5 cout << root->data <<" "; 6 PreOrderRecursively(root->pLeft); 7 PreOrderRecursively(root->pRight); 8 } 9 }
b> 前序遍历非递归实现
1 void PreOrder(BinaryTreeNode *root) 2 {//非递归前序遍历:借助于栈,先将根入栈,只要栈不为空,就弹出一个结点,同时将其右孩子、左孩子入栈。 3 // 注意:右子树先入栈,以保证右子树在栈中处于左子树的下面[栈:后进先出] 4 if(root == NULL) 5 return; 6 stack<BinaryTreeNode*> s; 7 s.push(root);//根入栈 8 9 BinaryTreeNode *temp; 10 while(!s.empty())//栈不为空 11 { 12 temp = s.top();//访问栈顶结点 13 cout << temp->data<<" "; 14 s.pop();//出栈 15 if(temp->pRight) 16 s.push(temp->pRight); 17 if(temp->pLeft) 18 s.push(temp->pLeft); 19 } 20 }
参考:http://blog.csdn.net/xiajun07061225/article/details/12760627
http://blog.csdn.net/hackbuteer1/article/details/6583988
时间: 2024-10-26 19:26:33