會用遞迴了二叉樹的問題就會一大半了...
一.用遞迴求解
對於要利用二叉樹的規律的題都可以利用它的左節點也是其左子樹的根節點的特性來遞迴求解。可以說那種引數有根節點的題一般都可以用遞迴來解決,來看看《劍指offer》中可用遞迴解決的題
1.根據前序遍歷的性質,第乙個元素必然就是root,那麼下面的工作就是如何確定root的左右子樹的範圍。根據中序遍歷的性質,root元素前面都是root的左子樹,後面都是root的右子樹。那麼我們只要找到中序遍歷中root的位置,就可以確定好左右子樹的範圍
struct treenode* reconstructbinarytree(vectorpre,vectorin)
2.輸入兩棵二叉樹a,b,判斷b是不是a的子結構。(ps:我們約定空樹不是任意乙個樹的子結構)
首先對於a,b當前節點,如果相等那麼就接著判斷他們的左子樹上的節點是否相等以及右子樹上的節點是否相等bool issubtree(treenode* proota, treenode* prootb) else return false;
}bool hassubtree(treenode* proota, treenode* prootb)
3.操作給定的二叉樹,將其變換為源二叉樹的映象
4.輸入乙個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是則輸出yes,否則輸出no。假設輸入的陣列的任意兩個數字都互不相同。void mirror(treenode *proot)
treenode *tmp = proot->left;
proot->left = proot->right;
proot->right = tmp;
mirror(proot->left);
mirror(proot->right);
}
6.輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。bool judge(vector& a)
void bsd(treenode* root,vectors,int sum)
if(root->left != null) bsd(root->left,s,sum);
if(root->right != null) bsd(root->right,s,sum);
}};
7.輸入一棵二叉樹,求該樹的深度。從根結點到葉結點依次經過的結點(含根、葉結點)形成樹的一條路徑,最長路徑的長度為樹的深度。class solution
p = ss.top();
ss.pop();
if(isroot)else
p = p->right;
}return root;
}};
8.輸入一棵二叉樹,判斷該二叉樹是否是平衡二叉樹。int treedepth(treenode* proot)
上面題思路其實都一樣,掌握了遞迴對這些題還是很簡單class solution
int getheight(treenode* node)
};
還有是對某一節點的分析
9.給定乙個二叉樹和其中的乙個結點,請找出中序遍歷順序的下乙個結點並且返回。注意,樹中的結點不僅包含左右子結點,同時包含指向父結點的指標。
主要是分幾種情況class solution
return null;
}else
return temp;}}
};
右節點為空:當前節點是不是其父節點的左節點
(1)若是則後繼節點為其父節點
(2)若不是就一直往上遍歷直至找到為左節點的點
右節點不為空:再看右節點有無左節點
劍指Offer之 二叉樹的深度
題目 1 求二叉樹的最大深度和最小深度。2 判斷一棵二叉樹是不是平衡二叉樹。include using namespace std struct binarytreenode binarytreenode int value m nvalue value m pleft null m pright ...
劍指offer之二叉樹的深度
輸入一棵二叉樹,求該樹的深度。從根結點到葉結點依次經過的結點 含根 葉結點 形成樹的一條路徑,最長路徑的長度為樹的深度。方法一 可以使用遞迴的方法,分別求左子樹和右子樹的深度,則樹的深度是 更大者 1。這是乙個遞迴的方法。方法二 使用層次遍歷的方法,每訪問一層,則深度 1,所有層的訪問結束之後,就等...
劍指Offer之二叉樹的映象
操作給定的二叉樹,將其變換為源二叉樹的映象。二叉樹的映象定義 源二叉樹 8 6 10 5 7 9 11 映象二叉樹 8 10 6 11 9 7 5解題思路,遞迴遍歷樹,將樹的左右孩子交換即可。public class 二叉樹的映象 treenode my switchnode root system...