私は就職の面接のために勉強していて、木を見直していました、私はそれらを横断するときに問題はありませんが、私は正しい答えを見つけることができなかったという質問に行き着きました:
ルートノードへのポインタと、返したいノードのインオーダートラバーサル番号の2つのパラメータを指定して、ツリー内のノードを返す関数を記述します。ツリーに保存される唯一の情報は、各ノードの子の数です。
これまでのところ、ツリーに格納されている情報(子供の数)を気にする理由を理解することすらできませんでした。それ以外に、そのような木があると仮定した場合:
5
4 7
3 1 4
その場合、インオーダートラバーサルは次のようになります341547
が、必要なノードを返すコードを理解できません(議論のために、インオーダートラバーサル番号は2であると想定しています。つまり、値1のノードが必要です)。
再帰的トラバーサルを実行しようとしましたが、最終的に内部カウンターをねじ込んでしまうため、別のアプローチを試し、すべてをスタックに配置しようとしましたが、正しく実行する方法がわかりません。これまでのところ:
public int findNode(root, position){
Stack<Integer> s = new Stack<Integer>();
cNode = root; //cNode = current Node
while(cNode.left != null)
cNode = cNode.left;
s.push(cNode);
while(cNode.right != null)
cNode = cNode.right;
//stuck here.
}
再帰的アプローチの方が簡単でしたが、探している#があるかどうかを確認する方法がわかりません。
public int findNode(root, position){
cNode = root;
if(cNode != null){
findNode(cNode.left, position);
System.out.print(cNode.data);
findNode(cNode.right, position);
}
}
私はこれが木を横断することを知っていますが、それでも私が望むことを正確には行いません。どんな助けでもいただければ幸いです。