對於二叉樹的演算法問題,我們可以根據二叉樹本身的定義的遞迴性質求解,或者使用對二叉樹的遍歷演算法進行求解.下面我們看幾個關於二叉樹高度,寬度和節點個數的演算法
一,求二叉樹的高度
1,使用二叉樹遞迴定義的性質求二叉樹的高度
如果根節點為空,返回0
否則
遞迴求左子樹高度 getheightrecurse(root.left)
遞迴求右子樹高度 getheightrecurse(root.right)
返回左右子樹最大的高度加1
對應**是:
public int getheightrecurse(treenoderoot)
int leftheight = getheightrecurse(root.left);
int rightheight = getheightrecurse(root.right);
return leftheight > rightheight ? leftheight + 1 : rightheight + 1;
}
2,利用層遍歷求得樹的高度
求得二叉樹的最大的層次數,也就是二叉樹的高度
**如下:
/**
* 通過層次遍歷來求得樹的高度,每增加一層高度增加1
* * @param root
* 樹的根節點
* @return 樹的高度
*/public int getheightbylevel(treenoderoot)
linkedlist> queue = new linkedlist>();
int front = 0, rear = 1, last = 1;
int height = 0;
queue.add(root);
treenodenode = null;
while (front != rear)
if (node.right != null)
front++;
// 本層節點遍歷完畢
if (front == last)
} return height;
}
3,利用後序遍歷的性質
當我們使用非遞迴的後序遍歷時,我們需要乙個棧進行輔助. 當我們遍歷到某個節點的時候,棧中的元素從棧頂到棧底就是根節點到該節點的路徑.所以,我們可以得到所有葉子節點的路徑,路徑中節點的個數就是根節點到葉子節點的高度,選取最大的那個高度,就是二叉樹的高度.對應**是:
/**
* 後序遍歷獲取樹的高度
* * @param root
* @return 樹的高度
*/// 思路:棧中的節點是 根節點到該節點的路徑
public int getheightbypostorder(treenoderoot)
int height = 0;
list> stack = new arraylist>();
treenodenode = root;
do treenodetemp = null;
boolean flag = true;
while (flag && stack.size() > 0)
node = stack.remove(stack.size() - 1);
temp = node;
} else
}} while (stack.size() > 0);
return height;
}
二,求二叉樹的寬度
1,利用層次遍歷求二叉樹的寬度
分層遍歷,求得每一層的節點個數,然後取最大的那層節點的個數就是寬度
/**
* 通過層次遍歷獲取二叉樹的寬度
* * @param root
* 根節點
* @return 二叉樹的寬度
*/public int getwidth(treenoderoot)
int width = 0;
list> queue = new arraylist>();
treenodenode = null;
queue.add(root);
int front = 0, rear = 1;
int start = 0, last = 1;
while (front != rear)
if (node.right != null)
front++;
if (front == last)
} return width;
}
2,利用遞迴方式求二叉樹的寬度
當遞迴進行遍歷的時候,傳遞乙個陣列和乙個該節點所在的層數,同一層的節點被訪問的時候都對該層在陣列對應的索引處的元素值自增.然後求得陣列中最大值即可
對應演算法如下:
/**
* 遞迴方式得到樹的寬度
* * @param root
* 根節點
* @return 樹的寬度
*/public int getwidthbyrecurse(treenoderoot)
int levels = new int[10];
getwidthhelper(root, 0, levels);
int max = 0;
for (integer count : levels)
return max;
} private void getwidthhelper(treenoderoot, int level, int levels)
levels[level]++;
getwidthhelper(root.left, level + 1,levels);
getwidthhelper(root.right, level + 1, levels);
}
三,求節點的個數
對於求二叉樹總共的節點個數,還是葉子節點個數,或者度為1的節點個數,或者度為2的節點個數,都可以使用前中後序遍歷和層次遍歷的方式進行.
下面對求各種節點個數的方法是依據二叉樹的遞迴性質進行求解
1,求二叉樹節點的個數
1(根節點)+左子樹節點個數+右子樹節點個數=二叉樹所有節點的個數
/**
* 遞迴實現獲取二叉樹所有的節點個數
* * @param root
* @return 節點個數
*/// 思路:二叉樹本身的定義就是乙個遞迴定義,所以我們可以利用這個性質. 獲取他左子樹的節點個數+右子樹節點個數+根節點1
// 其他思路:二叉樹的遍歷會把每個節點當且近且訪問一次,那麼我們可以通過各種遍歷二叉樹的辦法節點個數相加即可
public int getnodenumber(treenoderoot)
int leftnum = getnodenumber(root.left) + 1;
int rightnum = getnodenumber(root.right);
return leftnum + rightnum;
}
2,求葉子節點個數
如果根節點為空,返回0
如果根節點左右子樹都為空,返回1 否則
左子樹根節點個數+右子樹根節點個數
/**
* 遞迴獲取二叉樹中葉子節點的個數
* * @param root
* @return 二叉樹中葉子節點的個數
*/// 思路和獲取二叉樹節點個數相同. 只是加了乙個葉子節點的判斷
// 其他思路:可以使用二叉樹的遍歷進行求解
public int getleafnumber(treenoderoot)
if (root.left == null && root.right == null)
int leftnum = getleafnumber(root.left);
int rightnum = getleafnumber(root.right);
return leftnum + rightnum;
}
3,求度為2的節點個數
**如下:
如果根節點為空 ,返回0
否則 遞迴得到左子樹度為2的節點個數
遞迴得到右子樹度為2的節點個數
如果根節點度為2
返回左子樹度為2的個數+右子樹度為2的個數+1 否則
返回左子樹度為2的個數+右子樹度為2的個數
// 其他思路:遍歷
public int gettwodegreenode(treenoderoot)
int leftnum = gettwodegreenode(root.left);
int rightnum = gettwodegreenode(root.right);
if (root.left != null && root.right != null)
return leftnum + rightnum;
}
求二叉樹的高度,寬度 節點個數 葉子節點個數
include include include 實現求二叉樹的高度,寬度 節點個數 葉子節點個數 typedef struct node tnode,ptnode ptnode createtree else ptnode data data ptnode lchild createtree ptn...
完全二叉樹子節點個數
題目 乙個具有n個節點的完全二叉樹,其葉子節點的個數為多少?分析 設葉子節點個數為n0,度為1的節點個數為n1,度為2的節點個數為n2 側有 n0 n1 n2 n 1 對於二叉樹有 n0 n2 1 2 由 1 2 n0 n 1 n1 2 3 由完全二叉樹的性質可知 n1 0 或 1總結 a 當n1 ...
完全二叉樹的節點個數
給出乙個完全二叉樹,求出該樹的節點個數。說明 完全二叉樹的定義如下 在完全二叉樹中,除了最底層節點可能沒填滿外,其餘每層節點數都達到最大值,並且最下面一層的節點都集中在該層最左邊的若干位置。若最底層為第 h 層,則該層包含 1 2h 個節點。示例 輸入 1 2 3 4 5 6 輸出 6 defini...