关键码是否在目标二叉树中(search函数)
编写一个递归函数search,传入参数为一颗二叉树根结点root和关键码值K,如果出现K返回true值,否则返回false值。
课本的答案为:
1 template <class Key, class Elem, class KEComp> 2 bool search(BinNode<Elem>* subroot, Key K); 3 { 4 if (subroot == NULL) return false; 5 if (subroot->value() == K) return true; 6 if (search(subroot->right())) return true; 7 return search(subroot->left()); 8 }
我做的答案为:
1 template<lass Elem> 2 bool prime=false; 3 bool search(BinNode<Elem>*subroot,key K) 4 { 5 if(subroot==NULL)return; 6 if(prime) return; 7 if(subroot->value()==k){prime=true;return;} 8 search(subroot->left,K); 9 search(subroot->right,K); 10 return prime; 11 }
为什么课本的就如此简单呢?
分析:我做的思路是站在一个很小的问题来看整个大问题,所以考虑的东西多一些,因此不免多判断if(prime)语句;而课本答案的是充分体现了递归的思想,把递归的思想表现得淋漓尽致,答案的思路:
1:找出最小问题
1 if (subroot == NULL) return false;
2 if (subroot->value()==K )return true;
2:把一个大问题化为两个小问题(较难的情况还要转化子问题适用于递归,这道就不用,子问题已经适用了)
1 if (search(subroot->right())) return true; 2 return search(subroot->left());
这道题还好,他的子问题完全与父问题一样;但有些题目他的子问题不是完全与父问题一样,则我们需要设定某些判断把子问题中与父问题不同的特殊情况给排除掉,
经过排除特殊情况的子问题后的子问题就与父问题一样了,就可以递归了。
随笔中的二叉树的顺序结点表示法的解码为一颗二叉树的问题就是很好的体现。