非递归中序遍历二叉树的实现思考了好久,想出一个很麻烦的办法,大致思路是先走最左,再回中点,再向右一格,记录已经访问的节点,已经访问过就向上,如此循环,需要记录是否已经访问过,还有要一个指向父母的指针。然后查了一下,有用栈加已经访问标志的,WIKI上有个简单的方式,但近乎于玩杂技,只需要添加parent字段,用prev, current, next三个指针来控制下一步应该如何走,实现如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | void traverse_no_recurise(treenode_t *tree_root, pfunc_tree_callback pfcb_traversenode) { if (!tree_root) return; treenode_t *current = tree_root; treenode_t *prev = NULL; treenode_t *next = NULL; while (current) { // if we can go left if (prev == current->parent) { prev = current; //prepare to go left next = current->left_child; } // if left is empty and Pre is going from left, dump and prepare to go right if (next == NULL || prev == current->left_child) { pfcb_traversenode(current); prev = current; next = current->right_child; } // If we can't go right (leaf) and previous is right, prepare to go back to parent. if (next == NULL || prev == current->right_child) { prev = current; next = current->parent; } current = next; } } |
漂亮的算法!