Gri*_*han 3 c c++ algorithm advanced-search data-structures
使用递归函数(预订)打印二进制搜索树(BST).我需要打印当前节点的所有父节点(路径根目录).
可以使用辅助数据结构(例如,我的代码中的路径),但我不想保留node-> path来存储路径.
Run Code Online (Sandbox Code Playgroud)4 / \ / \ 2 6 / \ / \ 1 3 5 7
假设我使用预顺序遍历在行中打印节点:
NODE PATH
4 4
2 4,2
1 4,2,1
3 4,2,3
6 4,6
5 4,6,5
7 4,6,7
Run Code Online (Sandbox Code Playgroud)
我做了如下:工作正常!
路径以此代码中的0(零)值结束.BST中没有节点值为0.
void printpath(int* mypath){
while(*mypath)
printf("%d ", *mypath++);
}
void preorder(struct tree *p, int* path){
int *mypath = calloc(sizeof(path)/sizeof(int) + 1 , sizeof(int*));
int* myp=mypath;
if(p!=NULL){
while( *myp++ = *path++ );
--myp;
*myp=p->data;
*(myp+1)=0;
printf("%d PATH ",p->data);
printpath(mypath);
printf("\n");
preorder(p->left, mypath);
preorder(p->right, mypath);
}
free(mypath);
}
Run Code Online (Sandbox Code Playgroud)
但我不想保留路径数组,因为BST中有很多节点.有人可以建议我其他数据结构/方法吗?一个建议就够了,但应该是有效的.
这是一个老技巧,仍然有效: keep the back pointers in the call stack.
struct stacked_list{
struct stacked_list* prev;
struct tree* tree;
};
void printpath_helper(int data, struct stacked_list* path) {
if (!path->prev)
printf("%d PATH ", data);
else
printpath_helper(data, path->prev);
printf("%d ", path->tree->data);
}
void printpath(struct stacked_list* path) {
printpath_helper(path->tree->data, path);
putchar('\n');
}
void preorder_helper(struct stacked_list* path) {
if (path->tree) {
printpath(path);
struct stacked_list child = {path, path->tree->left};
preorder_helper(&child);
child.tree = path->tree->right;
preorder_helper(&child);
}
}
void preorder(struct tree* tree) {
struct stacked_list root = {NULL, tree};
preorder_helper(&root);
}
Run Code Online (Sandbox Code Playgroud)
每次递归preorder_helper都会创建一个参数struct并将其地址传递给下一个递归,从而有效地创建一个参数的链接列表,这些参数printpath_helper可以走到实际打印路径.由于您希望从上到下打印路径printpath_helper,因此还需要反转链接列表,因此最终会使函数的递归深度加倍; 如果你可以从底部到顶部打印,printpath_helper可以是一个简单的循环(或尾递归).
| 归档时间: |
|
| 查看次数: |
1025 次 |
| 最近记录: |