// 先序遍历伪代码:非递归版本,用栈实现,版本1 void preOrder1(TNode* root) { Stack S; while ((root != NULL) || !S.empty()) { if (root != NULL) { Visit(root); S.push(root); // 先序就体现在这里了,先访问,再入栈 root = root->left; // 依次访问左子树 } else { root = S.pop(); // 回溯至父亲节点 root = root->right; } } }
2 回答
萧十郎
TA贡献1815条经验 获得超13个赞
应该是起到标记作用,标记被访问过的根节点;因为先序遍历的特点是先访问根节点,再依次遍历左子树,左子树遍历完之后,在回溯到根节点,继续遍历右子树,如果不做标记的话,回溯的时候就不知道哪些节点是被访问过的;
慕后森
TA贡献1802条经验 获得超5个赞
Visit在这里代表一个泛用的过程,也就是说对子树进行操作的过程。比如说这整个过程,如果是想要输出对应的节点,那在里面可能就是
void Visit(TNode *node)
{
cout<<node->value<<" ";
}
这样的样子;或者,比如要交换每个节点的左右子树,那就是
void Visit(TNode *node){
TNode *temp = node->left;
node->left = node->right;
node->right = temp;
}
这样的形式。总之就是任何可以对单个节点进行操作的代码,根据需要而定。
二叉树遍历是不需要标记的,因为树形结构,每个节点不可能访问超过一次(不存在环的缘故)。
添加回答
举报
0/150
提交
取消
