给定一个n节点二叉树,写出一个O(n)时间的非递归的过程,将该树每个结点的关键字输出。要求除该树本树的存储空间外只能使用固定量的额外存储空间,且过程中不得修改该树,即使是暂时的修改也不允许。
(算法导论第三版第十章10.4-5)
template<typename T>
void TraverseBinaryTreeNonRecursive(const BinaryTreeNodeIndex<T>* array,int index)
{int prev = -1;int current = index;while (current!= -1){if(prev == array[current].parent){std::cout<<array[current].key<<" ";prev = current;if(array[current].left!= -1){current = array[current].left;}else{if(array[current].right!= -1){current = array[current].right;}elsecurrent = array[current].parent;}}else if(prev == array[current].left && array[current].right!= -1){prev = current;current = array[current].right;}else{prev = current;current = array[current].parent;}}std::cout<<endl;
}
辅助类 BinaryTreeNodeIndex
地址
测试代码
BinaryTreeNodeIndex<int> binaryTreeNode[10] = {BinaryTreeNodeIndex<int>(12,5,6,2),BinaryTreeNodeIndex<int>(15,7,7,-1),BinaryTreeNodeIndex<int>(4,0,9,-1),BinaryTreeNodeIndex<int>(10,5,4,8),BinaryTreeNodeIndex<int>(2,3,-1,-1),BinaryTreeNodeIndex<int>(18,-1,0,3),BinaryTreeNodeIndex<int>(7,0,-1,-1),BinaryTreeNodeIndex<int>(14,1,5,1),BinaryTreeNodeIndex<int>(21,3,-1,-1),BinaryTreeNodeIndex<int>(5,2,-1,-1),};TraverseBinaryTreeNonRecursive(binaryTreeNode,5);