1 題目及要求
1.1 題目描述
給一個二叉樹,請找出其中的中序遍歷的第k節點。
2 解答
2.1 題目分析
中序遍歷時每訪問一個節點後k減一,直到k==1時的節點就是所求節點。
2.2 代碼
#include <iostream>
#include <stack>
using namespace std;
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
// 遞歸實現
TreeNode* kthTreeNode1(TreeNode *root, int &k){
if(!root||k<1) return nullptr;
TreeNode *np = nullptr;
np = kthTreeNode1(root->left,k);
if(!np){
if(k==1) np = root;
--k;
}
if(!np) np = kthTreeNode1(root->right,k);
return np;
}
// 循環實現
TreeNode* kthTreeNode2(TreeNode *root, int k){
stack<TreeNode*>st;
while(!st.empty() || root){
if(root){
st.push(root);
root = root->left;
}
else{
root = st.top();
st.pop();
if(k==1) return root;
--k;
root = root->right;
}
}
return nullptr;
}
int main(){
TreeNode ht[]={1,2,3,4,5,6,7};
ht[3].left = ht+1; ht[3].right = ht+5;
ht[1].left = ht; ht[1].right = ht+2;
ht[5].left = ht+4; ht[5].right = ht+6;
TreeNode *np =nullptr;
for(int k1(1),k2;k1<8;++k1){
k2 = k1;
cout << "求第 " << k1 << " 個節點: ";
np = kthTreeNode1(ht+3,k2);
np?(cout << np->val):(cout << "NULL");cout << " ";
np = kthTreeNode2(ht+3,k1);
np?(cout << np->val):(cout << "NULL"); cout << endl;
}
return 0;
}